利用栈实现中缀表达式转换成后缀表达式
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define OK 1
#define ERROR 0
#define STACK_INIT_DATA 20//初始化栈的大小
#define STACKINCREMENT 10//动态扩容栈的大小
typedef char Elemtype;
typedef int Status;
typedef struct{
Elemtype *top;
Elemtype *base;
int stackSize;
}sqStack;//定义一个栈
void InitStack(sqStack *s){//初始化栈
s->base=(Elemtype*)malloc(STACK_INIT_DATA*sizeof(sqStack));//为栈申请空间
if(!s->base)//若没有空间,则关闭
exit(0);
s->top=s->base;//初始化为空栈
s->stackSize=STACK_INIT_DATA;
}
void Push(sqStack *s,Elemtype e){//出栈函数
if(s->top-s->base>=s->stackSize){//判断栈是否已满
s->base=(Elemtype*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(sqStack));//满了则扩大栈的大小
if(!s->base)
exit (0);
s->top=s->base+s->stackSize;
s->stackSize+=STACKINCREMENT;
}
*(s->top)=e;
s->top++;
}
void Pop(sqStack *s,Elemtype *e){//出栈函数
if(s->top==s->base)//判断是否为空栈
return;
s->top--;
*e=*(s->top);
}
int StackLen(sqStack s){//计算当前栈所用的空间的大小
return (s.top-s.base);
}
void main(){
Elemtype c,e;
sqStack s;
InitStack (&s);
printf("请输入表达式,#表示结束:");
scanf("%c",&c);
while(c!='#'){
if(c>='0'&&c<='9'||'.'==c){//如果输入的是数字或者点,则直接打印出来
printf("%c",c);
}
else if('+'==c||'-'==c){//如果输入的为加号或者减号
if(0==StackLen(s)){//判断栈中是否含有元素
Push(&s,c);//没有则将加号或者减号入栈
}
else{
do
{
Pop(&s,&e);//栈中有元素则将栈中‘(’元素之前的所有元素出栈,若栈中没有‘(’则全部出栈
if(e=='('){
Push(&s,e);
}
else
printf("%c",e);
}while(StackLen(s)&&'('!=e);
Push(&s,c);//将加号和减号入栈
}
}
else if(')'==c){//如果输入的是‘)’
Pop(&s,&e);
while(e!='('){//将栈中‘(’元素之前的所有元素出栈
printf("%c",e);
Pop(&s,&e);
}
}
else if('*'==c||'/'==c||'('==c)//如果输入的是乘号,除号或者是‘(’
Push(&s,c);//直接入栈
else{//如果输入的是上面没有规定的,则报错
printf("出错:输入格式错误!\n");
return -1;
}
if((c<'0'||c>'9')&&c!='.')
printf(" ");
scanf("%c",&c);
}
while(StackLen(s)){//将栈中剩下的所有元素出栈,并打印
Pop(&s,&e);
printf(" %c ",e);
}
printf("\n");
}