逻辑最重要
*/要优先于+- 所以要想好如何才能实现先*/后加减
如何协调运算符运算次序
首先我定义一个优先级递增串 ( +- */ )
右括号优先级最高左括号优先级最低
栈顶的运算符为A新产生的运算符为B,如果B的优先级高则直接放在上面
如果B的优先级低那么就要先运算栈顶运算符,然后将B放入栈顶,这样使得栈中的运算符优先级正确
进而直到所有运算符进栈,这个栈都是符合运算逻辑的
最后把剩下的统一出栈,取出数值栈中的数字(肯定只剩一个) 即为答案
这里我使用的方法是用一个栈来存储运算符,一个栈来放操作数
代码
这个代码反复设计了多次,最后感觉没什么可改的了,。。。
#include<cstdio>
#include<stack>
#include<cctype>
using std::stack;
#include<cstring>
stack<int> numsk;
stack<char> opsk;
char s[120];
int readNum(int &pos)
{
int num=0;
for(;isdigit(s[pos]);pos++)
{
num = num*10+int(s[pos]-'0');
}
return num;
}
int checkPriority(char op)
{
if(op=='(')
return 0;
else if(op=='+'||op=='-')
return 1;
else if(op=='*'||op=='/')
return 2;
else
return 3;
}
bool iscalc(char op)
{
if(opsk.empty())
return false;
char opk = opsk.top();
if(checkPriority(opk)>=checkPriority(op))
return true;
else
return false;
}
void calc()
{
char op;
int n1,n2;
op = opsk.top();
opsk.pop();
n1 = numsk.top();
numsk.pop();
n2 = numsk.top();
numsk.pop();
switch(op)
{
case '+':
numsk.push(n2+n1) ;
return;
case '-':
numsk.push(n2-n1);
return;
case '*':
numsk.push(n2*n1);
return;
case '/':
numsk.push(n2/n1);
return;
}
}
int main()
{
scanf("%s",s);
for(int i=0;i<strlen(s);i++)
{
if(isdigit(s[i]))
{
numsk.push(readNum(i));
i--;
}
else
{
char op = s[i];
if(op=='(')
{
opsk.push(op);
continue;
}
if(op==')')
{
char op1;
while(1)
{
op1 = opsk.top();
if(op1=='(')
{
opsk.pop();
break;
}
calc();
}
}
else
{
if(iscalc(op))
{
calc();
}
opsk.push(op);
}
}
}
char op1;
while(!opsk.empty())
{
calc();
}
printf("%d\n",numsk.top());
return 0;
}
AC时间2017.11.11