输入一个含括号的加减乘除表达式,输出该表达式的值:

 

思路:输入表达式,注意(可能带有括号),运用两个栈,符号栈和数字栈,首先判断优先级,把所有符号的优先级打表,进行运算,入栈时模仿单调栈,如果当前 优先级比栈顶元素优先级小,说明当前元素需要赶快计算,不然会影响以后的结果。例如2*3-2,‘-’进来的时候,优先级比’*’小,所以先把*运算运行完,运行完之后再把减号放进来。如果遇到优先级相等的情况即()的情况,就把现在括号内的都清空。另外我们可以在 字符串 前面后面都加一个#,防止最后计算不完的情况。

解释一下为什么 ,新来的优先级要比栈顶元素的优先级高

看一下这个例子:

2*3+1  当来到'+'时,这时候加号的优先级比栈顶元素'*'底,说明前面的计算必须要完成了,要不然会出错。

然后注意括号 栈顶元素 括号 的优先级 要比 新来括号的优先级低,要让他入栈。

AC:

#include<bits/stdc++.h>
const int maxn=1000250;
using namespace std;
typedef long long ll;
struct num{
	int *base;
	int size,len;
	void inint()
	{
		size=maxn;
		base=(int*)malloc(sizeof(int)*maxn);
		len=0;
	}
	int empty()
	{
		if(!len) return 1;
		return 0;
	}
	void push(int x)
	{
		base[++len]=x;
	}
	void pop()
	{
		len--;
	}
	int top()
	{
		return base[len];
	}
}st;
struct oper{
	char *base;
	int size,len;
	void inint()
	{
		size=maxn;
		base=(char*)malloc(sizeof(char)*maxn);
		len=0;
	}
	int empty()
	{
		if(!len) return 1;
		return 0;
	}
	void push(char x)
	{
		base[++len]=x;
	}
	void pop()
	{
		len--;
	}
	char top()
	{
		return base[len];
	}
}op;
char str[maxn];
int p[10][10]={
{0},
{0,1,1,0,0,0,1,1},
{0,1,1,0,0,0,1,1},
{0,1,1,1,1,0,1,1},
{0,1,1,1,1,0,1,1},
{0,0,0,0,0,0,2,-1},
{0,1,1,1,1,-1,1,1},
{0,0,0,0,0,0,-1,2}
};
int Creatmap(char a)
{
	switch(a)
	{
		case '+':return 1;
		case '-':return 2;
		case '*':return 3;
		case '/':return 4;
		case '(':return 5;
		case ')':return 6;
		case '#':return 7;
	}
}
int Cmp(char a,char b)// a是栈顶元素
{
	return p[Creatmap(a)][Creatmap(b)];
}
int cal(int a,int b,char ch)
{
	switch(ch)
	{
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case '/':return a/b;
	}
}
void solve()
{
	int len=strlen(str);
	for(int i=0;i<len;i++)
	{
	    if(str[i]==' ') continue;
		if(str[i]>='0'&&str[i]<='9')
		{
			int x=0;
			while(str[i]>='0'&&str[i]<='9')
			{
				int temp=str[i]-'0';
				x=x*10+temp;
				i++;
			}
			i--;//不满足的时候多加了1
			st.push(x);
		}
		else
        {
            if(op.empty()||!Cmp(op.top(),str[i]))
                op.push(str[i]);
            else if(Cmp(op.top(),str[i])>0)
            {
                while(!op.empty()&&Cmp(op.top(),str[i])>0)
                {
                    if(Cmp(op.top(),str[i])==2)
                    {
                        op.pop();
                        break;
                    }
                    else if(Cmp(op.top(),str[i])==1)
                    {
                        int x=st.top();st.pop();
                        int y=st.top();st.pop();
                        int z=cal(y,x,op.top());
                        st.push(z);
                        op.pop();
                    }
                }
                if(str[i]!='#'&&str[i]!=')') op.push(str[i]);
            }
        }
	}
	printf("%d\n",st.top());
}
int main()
{
	st.inint();r
	op.inint();
	scanf("%s",str+1);
	int len=strlen(str+1);
	str[0]='#';str[len+1]='#';
	str[len+2]='\0';
	solve();
}
/***
7-6*(2/1+2)
***/

运行结果:

优先级表参照:《数据结构》 宋丽华 张小峰老师著