原题链接数据结构-表达式求值 - C语言网 (dotcpp.com)
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define Elemtype int
char String[100000]={0};
//数字栈
typedef struct SNode{
Elemtype Data[1000];
int Top;
}*Stack,SNode;
void Push (Stack,Elemtype);
int Pop(Stack,Elemtype*);
int TopStack(Stack);
void ClearStack(Stack);
//符号栈
typedef struct SNode_{
char Data[1000];
int Top;
}*Stack_,SNode_;
void Push2 (Stack_,char);
int Pop2(Stack_,char*);
char TopStack2(Stack_ PtrS);
int Compare (char a, char b);
int Sum(int a, int b, char c);
int main(){
//置空栈 数字栈
Stack PtrS;
PtrS=(Stack)malloc(sizeof(SNode));
PtrS->Top=-1;
//置空栈 字符栈
Stack_ PtrS2;
PtrS2=(Stack_)malloc(sizeof(SNode_));
PtrS2->Top=-1;
int i,str_len,e,sum=0,a,b,j;
char f,F,h;
while (gets(String) != NULL){
//记录字符串长度
str_len=strlen(String);
e=atoi(String);
//将第一个数放入数字栈
Push(PtrS,e);
for (i=0;i<str_len;i++){
//找到符号
if (String[i]<'0' || String[i]>'9'){
f=String[i];
//如果字符栈为空,直接将第一个符号放入字符栈
if (PtrS2->Top==-1){
Push2(PtrS2,f);
}
else{
//如果是#,就将符号栈里的元素全都Pop,并进行计算
if (f=='#'){
while (PtrS2->Top != -1){
Pop2(PtrS2,&h);
Pop(PtrS,&a);
Pop(PtrS,&b);
sum=Sum(a,b,h);
//将求出的和放入数字栈,以便做下一次运算
Push(PtrS,sum);
}
break;
}
//如果是),就将(以上的全部元素Pop并计算
else if (f==')'){
while (TopStack2(PtrS2) != '('){
Pop2(PtrS2,&h);
Pop(PtrS,&a);
Pop(PtrS,&b);
sum=Sum(a,b,h);
//将求出的和放入数字栈,以便做下一次运算
Push(PtrS,sum);
}
//将(Pop出来
Pop2(PtrS2,&h);
}
//比较优先级
else{
//如果即将放入栈的符号的优先级大于栈顶元素的优先级,就将该符号直接放入符号栈中
if (Compare(f,TopStack2(PtrS2))){
Push2(PtrS2,f);
}
else{
//如果符号栈不为空,并且当前符号的优先级小于栈顶元素的优先级,就将栈顶符号取出做运算
while (PtrS2->Top != -1 && !Compare (f,TopStack2(PtrS2))){
Pop2(PtrS2,&h);
Pop(PtrS,&a);
Pop(PtrS,&b);
sum=Sum(a,b,h);
//将求出的和放入数字栈,以便做下一次运算
Push(PtrS,sum);
}
//将当前符号放入符号栈中
Push2(PtrS2,f);
}
}
}
//如果当前符号的下一个为数字的话,就将数字读入符号栈
if (String[i+1]>='0' && String[i+1]<='9'){
e=atoi(&String[i+1]);
Push(PtrS,e);
}
}
}
//输出当前行的计算结果,进行下一行的运算
printf("%d\n",sum);
}
return 0;
}
int Compare (char a, char b){
switch (a){
//(未放入栈时,优先级最高
case '(':
return 1;
//(放入栈中,优先级最低,其次是 + -
case '+':
if (b=='(') return 1; return 0;
case '-':
if (b=='(') return 1; return 0;
case '*':
if (b=='+'||b=='-'||b=='(')
return 1;
else return 0;
case '/':
if (b=='+'||b=='-'||b=='(')
return 1;
else return 0;
}
}
void Push (Stack PtrS, Elemtype item){
if (PtrS->Top == 1000-1){
printf("堆栈满");
return;
}
else {
PtrS->Data[++(PtrS->Top)]=item;
return;
}
}
void Push2 (Stack_ PtrS, char item){
if (PtrS->Top == 1000-1){
printf("堆栈满");
return;
}
else {
PtrS->Data[++(PtrS->Top)]=item;
return;
}
}
int Pop(Stack PtrS, Elemtype* locate){
if (PtrS->Top == -1){
printf("栈空");
return 0;
}
else{
*locate=PtrS->Data[PtrS->Top];
PtrS->Top=(PtrS->Top)-1;
return 1;
}
}
int Pop2(Stack_ PtrS, char* locate){
if (PtrS->Top == -1){
printf("栈空");
return 0;
}
else{
*locate=PtrS->Data[PtrS->Top];
PtrS->Top=(PtrS->Top)-1;
return 1;
}
}
int TopStack(Stack PtrS){
Elemtype e;
e=PtrS->Data[PtrS->Top];
return e;
}
void ClearStack (Stack PtrS){
Elemtype t;
while (PtrS->Top !=-1){
Pop(PtrS,&t);
}
}
char TopStack2(Stack_ PtrS){
char e;
e=PtrS->Data[PtrS->Top];
return e;
}
int Sum(int a, int b, char c){
switch (c){
case '+':
return b+a;
case '-':
return b-a;
case '*':
return b*a;
case '/':
return b/a;
}
}