这个我没有用链表做,利用一些栈的思路写下的;
首先判断优先级 '( ' '* /' ' + - ' ')' 四个优先级从大到小;
随输入字符计算,如果输入的x优先级小于str中的栈顶,x= ‘ + ’,str[c]=' * ',就从a数组里面d出两个数,str中d出栈顶;计算即可,把x和str的下一个栈顶比较;如果输入的x优先级大于str中的栈顶,直接入栈比如x= ‘ / ’,str[c]=' + ',就把x入栈;
而’( ‘ 的话就直接入栈,直到匹配到’ )‘在出栈,在代码中有解释的;
最后的a[1]即为答案
#include
#include
#include
#include
using namespace std;
typedef long long ll;
char str[520];
int a[520];
int n=0,c=0;
int pan(char x)
{
int f;
switch(x)
{
case '+':
case '-':
if(str[c]=='('||str[c]=='#')f=1;//x前面是这两个,计算不了,x要入栈
else f=2;//计算前面的表达式
break;
case'*':
case'/':
if(str[c]=='*'||str[c]=='/')//一样的话就计算前面的表达式咯,按顺序来嘛
f=2;
else f=1;//入栈
break;
case'(':
f=1;//出现’(‘ 直接入栈,直到出现 ‘)’再出栈
break;
case ')':
if(str[c]=='(')f=0;//f=0是不用计算前面的表达式,单纯的把(出栈
else f=2;//把(到这里的表达式计算个干净
break;
case '#':
if(str[c]=='#')f=0;//
else f=2;//把前面的表达式都计算出来
break;
}
return f;
}
int suan(int a,char x,int b)
{
int s=0;
switch(x)
{
case'+':
s=a+b;
break;
case'-':
s=a-b;
break;
case'*':
s=a*b;
break;
case'/':
s=a/b;
break;
}
return s;
}
int main()
{
char xx,x;
int f,l,r,s=0;
str[++c]='#';//栈底先放个‘#’
x=getchar();//输入
while(x!='#'||str[c]!='#')
{
if(x<='9'&&x>='0')
{
s=s*10+x-'0';//数字就算出来
x=getchar();
}
else
{
if(s!=0)
{
a[++n]=s;//压入数字栈中
s=0;//赋值0
}
f=pan(x);
switch(f)
{
case 0://只要把字符栈顶d出去就可以了
c--;
x=getchar();
break;
case 1://字符栈入栈
str[++c]=x;
x=getchar();
break;
case 2://计算前面的式子
r=a[n--];
l=a[n];
xx=str[c--];
a[n]=suan(l,xx,r);//数字栈减小一个,如a【i-1】+a【i】的值存到a【i】中
//cout<
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)