1. 程式人生 > >後綴表達式做計算器程序

後綴表達式做計算器程序

CP osi while 所有 height ssi emp tro align

概念:

後綴表達式是相較於中綴表達式而言的,像我們平時寫的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; }

運行結果:

技術分享圖片

後綴表達式做計算器程序