问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
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数组进行判断