ALGO-156 表達式計 算藍橋杯

問題描述

輸入一個只包含加減乖除和括號的合法表達式,求表達式的值。其中除表示整除。

輸入格式

輸入一行,包含一個表達式。

輸出格式

輸出這個表達式的值。

樣例輸入

1-2+3*(4-5)

樣例輸出

-4

數據規模和約定

表達式長度不超過100,表達式運算合法且運算過程都在int內進行。


主要思路:中綴表達式改爲後綴表達式並計算,後綴表達式又叫逆波蘭式,百度百科中介紹的很清楚(逆波蘭式),主要利用棧後進先出的特點來解決問題,通過兩個棧的相互關係來解決問題。
代碼:

#include <iostream>
#include <string>
#include <stack>

using namespace std;

char rel[7][7]={
	{'>','>','<','<','<','>','>'},
	{'>','>','<','<','<','>','>'},
	{'>','>','>','>','<','>','>'},
	{'>','>','>','>','<','>','>'},
	{'<','<','<','<','<','=','0'},
	{'>','>','>','>','0','>','>'},
	{'<','<','<','<','<','0','='}
};

char change(char a,char b);

int operate(int m,int n,char x);

int main()
{
    stack<char> RPNc;
    stack<int > RPNi;
    string str;
    cin >> str;
    str += "######";
    RPNc.push('#');
    char c = str[0];
    int i = 1;
    while(c != '#' || RPNc.top() != '#')
    {
        if(c >= '0' && c <= '9' )
        {
            int sum = 0;
            while(c >= '0' && c <= '9')
            {
                sum = sum*10 + (c - '0');
                c = str[i++];
            }
            RPNi.push(sum);
        }
        else
        {
            switch(change(RPNc.top(),c))
            {
				case'<':RPNc.push(c);c=str[i++];break;
				case'=':RPNc.pop();c=str[i++];break;
				case'>':
					char x=RPNc.top();
					RPNc.pop();
					int m=RPNi.top();
					RPNi.pop();
					int n=RPNi.top();
					RPNi.pop();
					RPNi.push(operate(m,n,x));
					break;
				default:break;
			}
        }
    }
    cout << RPNi.top() <<endl;
    return 0;
}
char change(char a,char b)
{
	int i,j;
	switch(a)
	{
		case'+':i=0;break;
		case'-':i=1;break;
		case'*':i=2;break;
		case'/':i=3;break;
		case'(':i=4;break;
		case')':i=5;break;
		case'#':i=6;break;
		default:break;
	}
	switch(b)
	{
		case'+':j=0;break;
		case'-':j=1;break;
		case'*':j=2;break;
		case'/':j=3;break;
		case'(':j=4;break;
		case')':j=5;break;
		case'#':j=6;break;
		default:break;
	}
	return rel[i][j];
}
int operate(int m,int n,char x)
{
	switch(x){
		case'+':return m+n;
		case'-':return n-m;
		case'*':return m*n;
		case'/':return n/m;
		default:return -1;
	}
}




主要問題:

	stack<char> RPNc;//儲存字符串的棧 RPN_char
    stack<int > RPNi;//儲存數字的棧 RPN_int
    string str;//輸入字符串

1.如何輸入數據?
採用的是string,也可以使用char數組
2.如何轉換字符串中的數字?

if(c >= '0' && c <= '9' )//判斷是否是數字
        {
            int sum = 0;
            while(c >= '0' && c <= '9')
            {
                sum = sum*10 + (c - '0');
                c = str[i++];
            }//將相連的數字字符轉化爲數字
            RPNi.push(sum);
        }

3.如何判斷運算符優先級?
設X1爲RPNc棧頂元素,X2爲字符串中待輸入的運算符
x1與x2關係表:
|x2\x1|+|-||/|(|)|#|
|—|:|:–|:–|:–|:–|:–|
|+|>|>|<|<|<|>|>|
|-|>|>|<|<|<|>|>|
|
|>|>|>|>|<|>|>|
|/|>|>|>|>|<|>|>|
|(|<|<|<|<|<|=|0|
|)|>|>|>|>|0|>|>|
|#|<|<|<|<|<|0|=|

//可以寫成一個字符數組表示關係relation
char rel[7][7]={
	{'>','>','<','<','<','>','>'},
	{'>','>','<','<','<','>','>'},
	{'>','>','>','>','<','>','>'},
	{'>','>','>','>','<','>','>'},
	{'<','<','<','<','<','=','0'},
	{'>','>','>','>','0','>','>'},
	{'<','<','<','<','<','0','='}};
	

在將字符串中的運算符壓入棧過程中通過change函數和rel數組進行判斷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章