解题思路:
注意事项: //下列1代表数字栈操作 2代表符号栈操作
参考代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct s{
int num[100]; //数字栈
char ch[100]; //符号栈
int top1; //数字栈顶指针
int top2; //符号栈顶指针
};
void clear(struct s *stack){ //初始化栈
stack->top1=-1;
stack->top2=-1;
}
int pop1(struct s *stack){ //弹出数字元素
int n;
n=stack->num[stack->top1];
stack->top1--;
return n;
}
char pop2(struct s *stack){ //弹出符号元素
char c;
c=stack->ch[stack->top2];
stack->top2--;
return c;
}
void push1(struct s *stack,int n){ //压入数字元素
stack->top1++;
stack->num[stack->top1]=n;
}
void push2(struct s *stack,char c){ //压入符号元素
stack->top2++;
stack->ch[stack->top2]=c;
}
int compare(char c){ //比较符号优先级
if (c=='+'||c=='-'){ //加减为1
return 1;
}else if (c=='*'||c=='/'){ //乘除为2
return 2;
}else{ //其他都为0,包括 左右括号都为0 ,()为0以便于不会对后面压入的符号产生影响
return 0;
}
}
int compute(int a,int b,char c){ //计算返回值
int s;
switch(c){
case '+':s=a+b;break;
case '-':s=a-b;break;
case '*':s=a*b;break;
case '/':s=a/b;break;
}
return s;
}
int main (){
struct s *stack;
stack=(struct s *)malloc(sizeof(struct s)); //用指针做的,先要创建一个空间
int a=0;
char c;
char b[1000];
int answer=0;
int f=0;
while (scanf ("%s",b)!=EOF){ //每一组表达式以字符串b输入
clear(stack); //每次初始化栈
answer=0;
for (int i=0;b[i]!='\0';i++){
if (b[i]>='0'&&b[i]<='9'){ //将数字字符转化成数字a
a=a*10+b[i]-'0';
f=1;
continue;
}else{
c=b[i]; //c为计算符号
}
if (f==1){
push1(stack,a); //数字入栈
f=0;
a=0;
}
if (c=='#'){ //以c为分支对象,分别讨论
break;
}else if (c=='('){ //c为左括号直接入栈
push2(stack,c);
}else if (c==')'){ //c为右括号计算到左括号前面
int s;
char t;
t=pop2(stack);
while (t!='('){ //计算到左括号前面,即将括号里的算出来
s=compute(pop1(stack),pop1(stack),t);
push1(stack,s);
t=pop2(stack);
}
}else{
if (compare(stack->ch[stack->top2])<compare(c)||stack->top2==-1){ //如果符号栈为空或者c的优先级高于符号栈栈顶的符号时,直接入栈即可
push2(stack,c);
}else{ //c的优先级高于符号栈栈顶的符号时,需要将栈顶符号计算出来的,将结果入栈的(这里不好理解,不懂的可以自己推导一下,先加减再乘除嘛)
int s;
s=compute(pop1(stack),pop1(stack),pop2(stack));
push1(stack,s);
push2(stack,c);
}
}
}
while (1){ //最后算出结果输出即可
if (stack->top2==-1){
printf ("%d\n",answer);
break;
}
answer=compute(pop1(stack),pop1(stack),pop2(stack));
push1(stack,answer);
}
}
}
0.0分
2 人评分