后缀表达式又称逆波兰表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)
#include <stdio.h>
#include "stack.h" //点击查看栈的创建
int compare(char a,char b);
void centerToBack(char array[]);
int main(){
char array[100];
gets(array);
centerToBack(array);
return 0;
}
//中缀转后缀
void centerToBack(char array[]){
//创建栈
Stack S = createStack();
int i,j;
for(j=0,i=0;array[i]!=0;i++){
//输出操作数
if(array[i]>='0'&&array[i]<='9'){
printf("%d",array[i]-'0');
continue;
}
//如果栈为空或当前操作符优先级高于栈顶的就入栈
if(isEmpty(S)||compare(array[i],top(S))>0){
push(S,array[i]);
}
else{
while(!isEmpty(S)&&compare(array[i],top(S))<=0){
if(top(S)=='('){
pop(S);
break;
}
printf("%c",top(S));
pop(S);
}
if(array[i]!=')'&&array[i]!='#'){
push(S,array[i]);
}
}
}
//销毁栈
destoryStack(S);
}
//比较运算符的优先级以#结尾
//eg:1+2*3+(4*5+6)*7#
int compare(char a,char b)
{
int i,j;
char q[7]={'+','-','*','/','(',')','#'};
//操作符优先级矩阵
int p[7][7]={{0,0,-1,-1,1,1,1},
{0,0,-1,-1,1,1,1},
{1,1,0,0,1,1,1},
{1,1,0,0,1,1,1},
{1,1,1,1,1,1,100},
{-1,-1,-1,-1,-1,100,1},
{-1,-1,-1,-1,-1,-1,0}};
for(i=0;i<7;i++)
if(a==q[i])
break;
for(j=0;j<7;j++)
if(b==q[j])
break;
return p[i][j];
}
#include "stack.h"
int compare(char a,char b);
void centerToBack(char array[]);
int main(){
char array[100];
gets(array);
centerToBack(array);
return 0;
}
//中缀转后缀
void centerToBack(char array[]){
//创建栈
Stack S = createStack();
int i,j;
for(j=0,i=0;array[i]!=0;i++){
//输出操作数
if(array[i]>='0'&&array[i]<='9'){
printf("%d",array[i]-'0');
continue;
}
//如果栈为空或当前操作符优先级高于栈顶的就入栈
if(isEmpty(S)||compare(array[i],top(S))>0){
push(S,array[i]);
}
else{
while(!isEmpty(S)&&compare(array[i],top(S))<=0){
if(top(S)=='('){
pop(S);
break;
}
printf("%c",top(S));
pop(S);
}
if(array[i]!=')'&&array[i]!='#'){
push(S,array[i]);
}
}
}
//销毁栈
destoryStack(S);
}
//比较运算符的优先级以#结尾
//eg:1+2*3+(4*5+6)*7#
int compare(char a,char b)
{
int i,j;
char q[7]={'+','-','*','/','(',')','#'};
//操作符优先级矩阵
int p[7][7]={{0,0,-1,-1,1,1,1},
{0,0,-1,-1,1,1,1},
{1,1,0,0,1,1,1},
{1,1,0,0,1,1,1},
{1,1,1,1,1,1,100},
{-1,-1,-1,-1,-1,100,1},
{-1,-1,-1,-1,-1,-1,0}};
for(i=0;i<7;i++)
if(a==q[i])
break;
for(j=0;j<7;j++)
if(b==q[j])
break;
return p[i][j];
}