C語言中綴表達(dá)式計(jì)算器

本文將介紹中綴表達(dá)式計(jì)算器的詳細(xì)寫法,是<a href="/2016/10/07/c%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8F%98%E5%90%8E%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F/">C語言把中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式</a>和<a href="/2016/10/07/C%E8%AF%AD%E8%A8%80%E9%80%86%E6%B3%A2%E5%85%B0%E8%AE%A1%E7%AE%97%E5%99%A8/">C語言逆波蘭計(jì)算器</a>的結(jié)合 ????但本篇用了更精簡的寫法,但是也相對(duì)的提高了代碼的理解難度,在閱讀時(shí),需自己詳細(xì)斟酌

開始

添加適當(dāng)?shù)念^文件

c語言的頭文件比不可少,我們這里還是添加適當(dāng)?shù)念^文件和宏定義并聲明函數(shù)

#include <stdio.h>  
#include <stdlib.h> 
 
#define MAX_LEN 80  
void convert2postfix(char *src, char *dst);
float cal(char *src);

中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式(操作符與操作數(shù)之間應(yīng)有空格隔開)

這里是另一種方式的中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,還有一種方式更容易理解一點(diǎn),但是代碼量相對(duì)更多,詳情可見<a >C語言把中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式</a>

void convert2postfix(char *src, char *dst) {
    char *psrc, *pdst;
    char stack[MAX_LEN];
    int top;
 
    top = -1;
    psrc = src;
    pdst = dst;
    while (*psrc != '\0') {
        if (*psrc >= '0' && *psrc <= '9') {
            *pdst = *psrc;
            pdst++;
            //加入分隔空格  
            if (!(*(psrc + 1) >= '0' && *(psrc + 1) <= '9') && *(psrc + 1) != '.') {
                *pdst = ' ';
                pdst++;
            }
        }
        if (*psrc == '.') {
            *pdst = *psrc;
            pdst++;
        }
        if (*psrc == '(') {
            stack[++top] = *psrc;
        }
        if (*psrc == ')') {
            while (stack[top] != '(') {
                *pdst = stack[top--];
                pdst++;
                //加入分隔空格  
                *pdst = ' ';
                pdst++;
            }
            //彈出'('  
            top--;
        }
        if (*psrc == '*' || *psrc == '/') {
            if (stack[top] == '*' || stack[top] == '/') {
                *pdst = stack[top--];
                pdst++;
                //加入分隔空格  
                *pdst = ' ';
                pdst++;
            }
            stack[++top] = *psrc;
        }
        if (*psrc == '+' || *psrc == '-') {
            while (stack[top] == '*'
                || stack[top] == '/'
                || stack[top] == '+'
                || stack[top] == '-') {
                *pdst = stack[top--];
                pdst++;
                //加入分隔空格  
                *pdst = ' ';
                pdst++;
            }
            stack[++top] = *psrc;
        }
        psrc++;
    }
    //掃描完成后,取出棧中所有運(yùn)算符,寫入后綴表達(dá)式數(shù)組。  
    while (top != -1) {
        *pdst = stack[top--];
        *pdst++;
        *pdst = ' ';
        pdst++;
    }
    *pdst = '\0';
 }
}

計(jì)算后綴表達(dá)式

同上還有另一種比較好理解的方式 見<a href="/2016/10/07/C%E8%AF%AD%E8%A8%80%E9%80%86%E6%B3%A2%E5%85%B0%E8%AE%A1%E7%AE%97%E5%99%A8/">C語言逆波蘭計(jì)算器</a>

float cal(char *src) {
    float stack[MAX_LEN];
    float opd1, opd2;
    int top;
    char *p, *pre;
    top = -1;

    p = src;
    while (*p != '\0') {
        if (*p >= '0' && *p <= '9') {
            pre = p;
            while ((*p >= '0' && *p <= '9') || *p == '.') {
                p++;
            }
            *p = '\0';
            stack[++top] = atof(pre);
        }
        if (*p == '+' || *p == '-' || *p == '*' || *p == '/') {
            opd2 = stack[top--];
            opd1 = stack[top--];
            switch (*p) {
            case '+':
                stack[++top] = opd1 + opd2;
                break;
            case '-':
                stack[++top] = opd1 - opd2;
                break;
            case '*':
                stack[++top] = opd1*opd2;
                break;
            case '/':
                //更嚴(yán)格一點(diǎn),應(yīng)該處理除數(shù)為0的情況  
                stack[++top] = opd1 / opd2;
                break;
            }
        }
        p++;
    }
    return stack[top--];
}

主函數(shù)

輸入中綴表達(dá)式作為一個(gè)字符串,調(diào)用中綴表達(dá)式轉(zhuǎn)換和后綴表達(dá)式計(jì)算便可以很容易得出結(jié)果。

nt main() {
    char str1[MAX_LEN], str2[MAX_LEN];
    float res;

    gets(str1);
    convert2postfix(str1, str2);
    
    res = cal(str2);
    printf("result:%.2f\n", res);
    return 0;
}

運(yùn)行結(jié)果

本人用的是vs2015編譯器,所以文中的scanf用了更安全的scanf_s,當(dāng)然也可以用fgets 詳情可以自行<a >baidu</a>或者<a >Google</a>

cmd 運(yùn)行結(jié)果

(1+4)*(4-5)=-5 結(jié)果正確


注:

  • 上述代碼在visual studio 2015中編譯成功運(yùn)行,其他ide請(qǐng)自行測(cè)試
  • 上述文字皆為個(gè)人看法,如有錯(cuò)誤或建議請(qǐng)及時(shí)聯(lián)系我
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 剛開始學(xué)習(xí)c語言時(shí),我們都學(xué)過輸入一個(gè)數(shù)在輸入一個(gè)操作數(shù)在輸入要進(jìn)行的計(jì)算方式,在輸入另一個(gè)操作數(shù),然后通過內(nèi)置的...
    EarthChen閱讀 6,814評(píng)論 1 1
  • 求表達(dá)式(1 - 2) * (4 + 5)的值 人類早就熟悉這種中綴表達(dá)式的計(jì)算公式,隨便拉一個(gè)小朋友過來,他就直...
    AceKitty閱讀 812評(píng)論 0 3
  • TITLE: 編程語言亂燉 碼農(nóng)最大的煩惱——編程語言太多。不是我不學(xué)習(xí),這世界變化快! 有時(shí)候還是蠻懷念十幾、二...
    碼園老農(nóng)閱讀 5,580評(píng)論 2 35
  • 1.黃金思維模型 首先我說下我對(duì)黃金思維的模型的理解: 你做一件事,要清楚你做這件事的目的是什么,或者為什么做這件...
    Kobe_Chen閱讀 506評(píng)論 0 0

友情鏈接更多精彩內(nèi)容