C語言中)逆波蘭演算法(及計算器,C語言編寫逆波蘭計算器

2022-06-10 10:51:44 字數 2930 閱讀 2665

1樓:匿名使用者

a+b ---> a,b,+

a+(b-c) ---> a,b,c,-,+a+(b-c)*d ---> a,b,c,-,d,*,+a+d*(b-c)--->a,d,b,c,-,*,+a=1+3 ---> a=1,3 +

它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:

如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。

2樓:匿名使用者

逆波蘭式子又叫做字尾表示式。(相對於字首和中綴,但是它倆都破壞了式子本身,所以用字尾)

12+3應該表達為12 3+。(實際無空格,為了好看)

先解決乙個問題,就是123+會不會認為是1和23或者1和2和3,其實是不會的。一般字尾式都是用棧儲存的,你在定義棧的時候裡面的elemtype e(當然也可以用別的就是舉例),這個elemtype是重新命名的int。scanf或者cin輸入的時候,你先輸入12,這個就被存在棧的第一空裡面(因為是%d嘛),再輸入3就被存在第二空裡面了。

這個不會混淆。

逆波蘭演算法是這麼工作的:在字尾式中掃瞄,可能會掃瞄到一堆數字,但是這時候如果掃瞄到了乙個運算子(加減乘除等),這時候提取運算子並提取運算子前面緊挨著的那兩個數字(注意是緊挨),然後這兩個數字和這乙個運算子進行運算。比如123+,掃瞄得12,掃瞄得3,掃瞄得+(電腦得到了+這個運算子),緊接著取前面緊挨的12和3,進行運算,就是12+3了。

如(2+1) * 3就是21+3*。掃瞄得2,掃瞄得1,掃瞄得+,ok這時候2+1=3,3入棧,重新while掃瞄。掃瞄得3(剛才算出來剛入棧的那個),掃瞄得3,掃瞄得*,ok這時候3*3=9。

1+23這種字尾式是表達不出來的。字尾它的意義就在於兩個數,他們的運算子關係緊挨在他們後面。這個1+只有乙個數,還原算是就是+1,無意義。

c語言編寫逆波蘭計算器

c語言 逆波蘭表示式 演算法

3樓:匿名使用者

#include

#include

int main()

else

if(strchr(fg, *c))

++c;

while((dp - d > 1 && k == 2) || !*c && dp - d >= 1)

--dp;}}

printf("%f", *dp);}

4樓:匿名使用者

1. #include

2. #include

3. double exp()

13. }

14. void main()15.

5樓:繝諭

有寫過。需要可試試。

算術表示式轉化成逆波蘭式(c語言)

6樓:世鑲柳

你可以擴充套件一下。

// 中綴表示式轉化為字尾表示式,僅支援加減乘除運算、運算元為1位十進位製非負整數的表示式。

char* infix2postfix(const char *infix, char *postfix)

stackopcode(n); // 堆疊存放的是操作符for (size_t i = 0; i < n; i++)}}return postfix;}

7樓:

從鍵盤輸入乙個算術表示式(回車鍵結束),螢幕輸出乙個逆波蘭式(字尾表示式);

#include

#include

#include

#define maxsize 15

#define n 30

typedef struct arraystack

stack;

//建立乙個棧並初始化

void createstack(stack *s)

s->top=-1;

}int isemptystack(stack *s) //判斷棧是否為空

//將算術表示式轉換為逆波蘭式

int ini_stack(stack *s,char str,char sptr)

else if(s->top==-1)

else if(str[i]=='(')

else if(str[i]==')')

s->top--;

}else if((s->stack[s->top]=='+'&&str[i]=='*')||(s->stack[s->top]=='-'&&str[i]=='*')||(s->stack[s->top]=='+'&&str[i]=='/')||(s->stack[s->top]=='-'&&str[i]=='/'))

else if((s->stack[s->top]==40&&str[i]=='*')||(s->stack[s->top]==40&&str[i]=='+')||(s->stack[s->top]==40&&str[i]=='/')||(s->stack[s->top]==40&&str[i]=='-'))

else

i++;

}while(s->top!=-1)

return j;

}//輸出逆波蘭式

void outnum(char sptr,int c)

printf(" .....輸出完成!\n");

}//從鍵盤輸入算術表示式

void readnum(char str)

//輸出逆波蘭式的值

void outsum(stack *f,char sptr,int b)

else}}

printf("...算術表示式的值為:%d\n",f->stack[f->top]);

}int main()

/*注意:還沒釋放malloc申請的內容*/

c語言設計簡單的計算器程式c語言設計乙個簡單的計算器程式

include stdio h 計算器 voidmenu 自定義的選單介面 printf n printf 請輸入你的選擇 n printf 1 n printf 2 n printf 3 n printf 4 n printf n intmain inti 0 intj 0 intnum 0 計算...

c語言編寫計算器程式,c語言設計乙個簡單的計算器程式

1 既然是簡單計算器,只需要實現加減乘除,同時每次支援兩個運算元和乙個操作符。同時約定,運算元為整型,對於加減乘輸出為整型,除法輸入為浮點型即可。2 例程 include int main 根據操作符號,輸入對應的執行結果。return 0 以上 就實現了最簡單的計算器,可以根據需要,在其上增加其它...

用c語言寫可以加減乘除的計算器,可迴圈的

李小宇 學了十天寫出的第一個小作品 include int main else if c else if c else if c else else return 0 首先,scanf f c f a t b 這句有錯,缺逗號。應改為scanf f c f a,t,b 其次,if get 這句有錯。...