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 這句有錯。...