栈的应用
逆波兰表达式的算法实现
中缀表达式转换为逆波兰表达式
void RPN(char str[]){ //此函数用来将中缀表达式转换为逆波兰表达式
SqStackC S; //建立一个栈用来存储待使用的运算符
char res[MaxSize],x;
int r=0;
InitStackC(&S);
for(int i=0;str[i]!='\0';i++){ //遍历字符串
if(str[i]>='0' && str[i]<='9'){ //如果是数字直接存入数组中
res[r++]=str[i];
}
else if(str[i] =='(' || StackEmptyC(S)){
PushC(&S,str[i]);
}
else if(str[i] =='*' || str[i]=='/' || str[i]=='+' || str[i]=='-'){ //如果是运算符
while(Compare(S.data[S.top])>=Compare(str[i])){ //此循环将栈顶向下所有优先级高于或等于此运算符的运算符弹出存入数组中
res[r++]=S.data[S.top--];
}
PushC(&S,str[i]); //将此运算符压入栈中
}
else if(str[i]==')'){ //如果是')'符号
while(S.data[S.top]!='('){ //将字符栈栈顶向下所有的运算符全部弹出并存入数组中,遇到'('停止
res[r++]=S.data[S.top--];
}
S.top--; //将'('弹出栈中,但不存入数组
}
}
while(!StackEmptyC(S)){ //将栈中剩余的运算符依次存入数组
PopC(&S,&x);
res[r++]=x;
}
res[r]='\0'; //结尾处存入'\0'
for(int i=0;res[i]!='\0';i++) //输出逆波兰表达式
printf("%c",res[i]);
putchar('\n');
printf("%d",CalRPN(res)); //计算逆波兰表达式结果
}
计算逆波兰表达式
ElemType CalRPN(char str[]){ //此函数用来计算逆波兰表达式
SqStack S;
InitStack(&S);
for(int i=0;str[i]!='\0';i++){ //遍历字符串
if(str[i]>='0' && str[i]<='9') //如果是数字则压入栈中
Push(&S,str[i]-'0');
else{
ElemType a,b;
Pop(&S,&b); //弹出两个操作数
Pop(&S,&a);
switch(str[i]){ //根据运算符做出相应运算,并将结果压入栈中
case '+':Push(&S,a+b);break;
case '-':Push(&S,a-b);break;
case '*':Push(&S,a*b);break;
case '/':Push(&S,a/b);break;
}
}
}
ElemType r;
Pop(&S,&r); //弹出栈中唯一剩余的元素,此元素为运算结果
return r; //返回结果
}
赋予运算符优先级
int Compare(char x){
if(x=='*' || x=='/') //为各个运算符设置优先级
return 2;
if(x=='+' || x=='-')
return 1;
if(x=='(')
return 0;
}