后綴表達式做計算器程序


概念:

后綴表達式是相較於中綴表達式而言的,像我們平時寫的2+3*(4-(5+6))/7就是一個中綴表達式,那么如何將之變為后綴表達式呢?后綴表達式如何用來求解呢?

 

先來第一個問題(中綴->后綴):

變為后綴表達式方法(規則)

1.遇到操作數:直接添加到后綴表達式中

2.棧為空時,遇到運算符,直接入棧

3.遇到左括號:將其入棧

4.遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。

5.遇到其他運算符:加減乘除:彈出所有優先級大於或者等於該運算符的棧頂元素,然后將該運算符入棧。

6.最終將棧中的元素依次出棧,輸出。

 

用一個實例來分析:

X = 2+3*(4-(5+6))/7

1、遇到操作數2,添加到后綴表達式中                                                             2 (此時的后綴表達式,下同)

2、棧為空,遇到加號‘+’,將‘+’入棧                                                          2

3、遇到操作數3,添加到后綴表達式中                                                             23

4、遇到操作符‘*’,棧頂為‘+’‘*’優先級大於‘-’,不出棧,‘*’入棧         23

5、遇到左括號,直接入棧。                                                                        23

6、遇到操作數4,添加到后綴表達式中                                                             234

7、遇到減號‘-’,棧頂為‘-’入棧                                                                   234

8、遇到左括號,直接入棧。                                                                         234

9、遇到操作數5,添加到后綴表達式中                                                              2345

10、遇到加號‘+’,棧頂為‘(’, ‘+’入棧                                                      2345

11、遇到操作數6,添加到后綴表達式中                                                            23456

12、遇到右括號’(不入棧),出棧‘+’,出棧(不添加到后綴表達式中)      23456+

13、遇到右括號’(不入棧),出棧‘-’,出棧(不添加到后綴表達式中)       23456+-

14、遇到‘/’,棧頂為‘*’ ‘/’優先級大於‘*’,將‘*’出棧                                              23456+-*

15、遇到操作時7,添加到后綴表達式中                                                            23456+-*7

16、把棧中剩下的符號都出棧                                                                             23456+-*7/+

 

 

 

代碼實現:

char* postfix_expression(string str)
{
	char *temp=new char(100);
	int j=0;
	for(int i=0; i<str.size(); i++)
	{
		if(str[i]>='0' && str[i]<='9')
			temp[j++]=str[i];
		else
		{
			if(str[i]==')')
			{
				while(S_c.top()!='(')
				{
					temp[j++] = S_c.top();
					S_c.pop();
				}
				S_c.pop();
			}
			//如果符號是*或/高優先級,彈出所有*和/ 
			else if(str[i]=='*'||str[i]=='/')
			{
				if(!S_c.empty())
					if(S_c.top()=='*'||S_c.top()=='/')
					{
						temp[j++] = S_c.top();
						S_c.pop();
					}
				S_c.push(str[i]);
			}
			//如果符號是+或-低優先級,彈出所有*/+- 
			else if(str[i]=='+'||str[i]=='-')
			{
				if(!S_c.empty())
					if(S_c.top()=='*'||S_c.top()=='/'||S_c.top()=='+'||S_c.top()=='-')
					{
						temp[j++] = S_c.top();
						S_c.pop();
					}
				S_c.push(str[i]);
			}
			else
				S_c.push(str[i]);	
		}
	}
	while(!S_c.empty())
	{
		temp[j++] = S_c.top();
		S_c.pop();
	}
	return temp;
}

  

 

第二個問題,如何使用后綴表達式來解表達式

后綴表達式已經將計算的優先順序排好,只需要將后綴表達式的數字逐個入棧,直到遇到符號,將前棧頂兩個元素運算放回棧頂即可。

以上面的后綴表達式為例:

23456+-*7/+

 

上代碼~

#include <iostream>
#include <string>
#include <cstring>
#include <stack>
using namespace std;

stack<int> S_n;
stack<char> S_c;

//上面的后綴表達式轉換函數 char* postfix_expression(string str); int main() { string str; char *pe; int temp; cin>>str; //將str轉為后綴表達式 pe = postfix_expression(str); for(int i=0; i<strlen(pe); i++) { if(pe[i]>='0'&&pe[i]<='9') { S_n.push(pe[i]-'0'); } else if(pe[i]=='*') { temp = S_n.top(); S_n.pop(); temp *= S_n.top(); S_n.pop(); S_n.push(temp); } else if(pe[i]=='/') { temp = S_n.top(); S_n.pop(); temp = S_n.top()/temp; S_n.pop(); S_n.push(temp); } else if(pe[i]=='+') { temp = S_n.top(); S_n.pop(); temp += S_n.top(); S_n.pop(); S_n.push(temp); } else if(pe[i]=='-') { temp = S_n.top(); S_n.pop(); temp = S_n.top()-temp; S_n.pop(); S_n.push(temp); } } cout<<pe<<endl; cout<<S_n.top()<<endl; return 0; }

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM