棧的應用2 超級計算器(中綴與字尾表示式)C語言

2022-04-21 22:10:28 字數 1771 閱讀 5358

輸入中綴表示式輸出結果(結果可以是小數,但輸入必須是整數)

1 #include2 #include//

需要兩個棧,乙個儲存結果,乙個儲存運算子

3#define newpc (stype *)malloc(sizeof(stype))

4#define newpi (inttype *)malloc(sizeof(inttype)) //

定義兩個申請位址的巨集

5 typedef struct

char_stack

6 stype;

10 typedef struct

int_stack

11 inttype;

15void charpush(stype** stacktop,char c) //

運算子壓棧函式,需要傳進棧頂指標本身的位址,而不是它指向的位址

1622

char charpop(stype** stacktop) //

運算子出棧函式

2330

void intpush(inttype** stacktop,double c) //

數字壓棧函式

3137

double intpop(inttype** stacktop) //

數字出棧函式

3845

void tanchu(char c,inttype ** stacktop) //

彈出字元,然後運算,然後進棧

4654

int tance(char c) //

探測優先順序的函式

5560

int main() //

主函式 功能:處理輸入的中綴表示式,輸出結果(過程中用到了字尾的轉化)

6184 intpush(&numtop,a); //

如果是個數字字元,就把這個數字一直讀進去(因為不一定是幾位數),然後壓棧到num裡

85}

86else

if (c=='

(') //

如果是左括號,直接壓棧到sig裡

8791

else

if (c=='

)') //

如果是右括號,就邊彈棧邊處理結果,直到遇到左括號

9297 c=getchar();

98 charpop(&sigtop);99}

100else

if (c=='

+'||c=='

-'||c=='

*'||c=='

/') //

如果是+-*/就比較與棧頂的優先順序,如果高,直接壓入,否則(等於也不能壓入),邊彈邊處理結果,直到可以壓入(和上面有點像)

101109

else

115 charpush(&sigtop,c);

116 c=getchar();

117}

118}

119else

//否則,忽略這個符號 ,並且顯示輸入有誤

120124

125}

126while (sigtop->dat!='

@') //

收收尾,把沒有彈出的都處理一下

127130 printf("

%.2lf\n

",numtop->dat);

131 c=getchar();

132return0;

133 }

棧的應用1 超級計算器(中綴與字尾表示式)C語言

這裡要學的程式主要用來實現乙個功能 輸入表示式輸出結果,也就是乙個計算器。效果如下 這個程式主要有兩個步驟 1 把中綴表示式轉換為字尾表示式 2 計算字尾表示式的結果。首先先明白幾個問題 2 怎麼把中綴表示式轉換為字尾表示式?3 怎麼用字尾表示式輸出結果?相信如果弄明白了上面幾個問題,有c語言基礎的...

棧應用 中綴轉字尾 字尾計算

中綴表示式 infix expression 即 平時生活中大家對於算式的書寫格式 eg 6 5 2 3 8 3 字尾表示式 post expression 即 把數字和運算子分開,把運算子的優先順序運算內涵到字尾式的數字和運算子的順序 中 故其 優點就是,沒有必要知道任何優先的規則 乙個運算子只對...

動態陣列 棧的應用 之中綴計算器

格式化表示式 public class infixcalculator private static string insertblanks string expression else return sb.tostring 執行結果 中綴表示式實現的簡易的計算器 操作符棧 數字棧 如果遇到數字 直...