棧的應用 計算表示式

2021-08-26 01:23:12 字數 1519 閱讀 7442

挺久之前寫的乙個作業,acm選修課的,用棧實現的計算表示式,有兩種,一種是將表示式轉換為字尾表示式再計算,一種是直接計算中綴表示式,下面是**。

(1)轉字尾再計算:

#include#includeusing namespace std; int main() s2.push(s); i--; break; case '+': case '-': if( (s1.empty()) || (s1.top()=='(') ) s1.push(p[i]); else //switch s1.pop(); }//while s1.push(p[i]); }//else break; case '*': case '/': if( (s1.empty()) || (s1.top()=='(') || (s1.top()=='+') || (s1.top()=='-') ) s1.push(p[i]); else s1.pop(); } s1.push(p[i]); } break; case '(': s1.push(p[i]); break; case ')': while( (!s1.empty()) && (s1.top()!='(') ) s1.pop(); } if(!s1.empty())//pop掉左括號 s1.pop(); break; }//switch i++; }//while while(!s1.empty()) //switch s1.pop(); }//while v3=s2.top(); s2.pop(); cout<

輸入: 55+34*(3*(3+6))-12

55+34*(3*(3+6))-12 55 34 3 3 6 + * * + 12 -=961 press any key to continue

(2)中綴直接計算

include#includeusing namespace std; int main() s2.push(s); i--; break; case '+': case '-': if( (s1.empty()) || (s1.top()=='(') ) s1.push(p[i]); else //switch s1.pop(); }//while s1.push(p[i]); }//else break; case '*': case '/': if( (s1.empty()) || (s1.top()=='(') || (s1.top()=='+') || (s1.top()=='-') ) s1.push(p[i]); else s1.pop(); } s1.push(p[i]); } break; case '(': s1.push(p[i]); break; case ')': while( (!s1.empty()) && (s1.top()!='(') ) s1.pop(); } if(!s1.empty())//pop掉左括號 s1.pop(); break; }//switch i++; }//while while(!s1.empty()) //switch s1.pop(); }//while v3=s2.top(); s2.pop(); cout《輸入: 55+34*(3*(3+6))-12

55+34*(3*(3+6))-12 =961 press any key to continue

棧的應用 計算字串表示式

計算機的本質工作就是做數 算 那計算機可以讀 入字串 1 2 3 4 5 6 7 並計算值嗎?答案是肯定的。這裡我基本實現了個位數的加減乘除,當然這個演算法最簡單的解決方式是採用二叉樹 後面會實現 這裡作出了棧的實現方式。首先引入兩個概念 中綴表示式和字尾表示式 1,在生活中我們通常書寫1 1的時候...

棧的應用 計算字串表示式

1.通過棧來實現字串公式的運算 2.中綴轉字尾 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 符號 與棧頂符號進行優先順序比較 棧頂符號的優先順序低 符號進棧 棧頂符號的優先順序高 將棧頂符號彈出並輸出,之後進棧 右括號 將棧中的所有符號彈出並輸出 3.計算字尾的值 遍歷...

計算表示式 棧

問題 現在有乙個合法的二進位制表示式,請計算出該表示式的值 input 輸入一行字串,表示乙個二進位制表示式。長度不超過 100,000 ouput 輸出表示式的值 input output 0 1 0 1 1 0 1 1 兩種方法 1 被動 遇到右括號再進行運算,直至左括號 include inc...