#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef struct stack{
char arr[100];
int top;
}stack,*Pstack;
void init(Pstack t){
t->top=-1;
}
int isempty(Pstack t){//栈为空返回1
if(t->top==-1) return 1;
else return 0;
}
void push(Pstack t,char x){
t->arr[++t->top]=x;
}
char pop(Pstack t){
if(t->top==-1)
return -1;//栈为空,返回-1
else return t->arr[t->top--];
}
char gettop(Pstack t){
if(t->top==-1)
return -1;//栈为空,返回-1
else return t->arr[t->top];
}
int pro(char c){//定义优先级
switch(c){
case '(':return 0;break;
case '+':
case '-':return 1;break;
case '*':
case '/':return 2;break;
case ')':return 3;break;//break 有毒!!
}
}
int cmp(char a,char b){
if(pro(a)>=pro(b)) return 1;//栈顶元素的优先级高于或等于待判断的元素时,弹出栈顶元素
else return 0;
}
int isletter(char c){
if(c>='a'&&c<='z') return 1;
else return 0;
}
int main(){
char c;
char p,q;
Pstack t=(Pstack)malloc(sizeof(stack));
init(t);
c=getchar();
while(c!='\n'){
if(isletter(c)) cout<<c<<"";//若为操作数,直接输出
else{
switch(c){
case '(':push(t,'(');break;//直接入栈
case ')':if(gettop(t)!='(') cout<<pop(t);//清空括号之间的内容
pop(t);//记住此处要pop出‘(’!!!
break;
default:
p=gettop(t);
if(cmp(p,c)==1) {
cout<<pop(t);
push(t,c);//栈顶元素出栈,也要push入栈!!
}
else push(t,c);
}
}
c=getchar();
}
while(!isempty(t)) cout<<pop(t);//当栈中还有元素时,也要输出
cout<<endl;
}
栈的运用--由中缀表达式转化为逆波兰表达式
最新推荐文章于 2022-05-30 12:00:03 发布