转换方法:
1、数字直接输出。
2、运算符 ‘+’ 和 ‘-’:若栈为空直接入栈 ;若栈里面有除 ‘(’ 之外的其他运算符,将栈里面的运算符出栈直到遇到 ‘(’ 运算符或者栈空,之后再将 ‘+’ 或 '-'入栈。
3、运算符 ‘’ 和 ‘/’:若栈中有运算符 '’ 或 ‘/’,将栈中运算符弹出,再将其入栈;其余情况直接入栈。
4、运算符 ‘)’ :将栈中运算符弹出直到遇到 ‘(’ 。
5、运算符 ‘(’ 直接入栈。
在这里插入代码片#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXSIZE 1024 //初始化栈有1024个空间
typedef char ElemType;
typedef struct
{
ElemType *top; //指向栈顶的指针变量
ElemType *base; //指向栈底 的指针变量
int stackSize; //栈可使用的最大容量
}SeqStack;
//创建栈
void InitStack(SeqStack *s)
{
s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!s->base)
exit(0);
s->top=s->base;
s->stackSize=MAXSIZE;
}
//判断栈是否为空
int Isempty(SeqStack s)
{
if(s.base==s.top)
return 0;
return 1;
}
//返回栈顶元素
int SeqStack_Top(SeqStack *s)
{
if(Isempty(*s))
{
int e=*--(s->top);
s->top++;
return e;
}
printf("栈为空返回失败\n");
return -1;
}
//出栈
void Pop(SeqStack *s,ElemType *e)
{
if(Isempty(*s))
{
*e=*--(s->top);
}
}
//入栈
void Push(SeqStack *s,ElemType vue)
{
if(s->top-s->base>=MAXSIZE)
{
s->base=(ElemType*)realloc(s->base,2*MAXSIZE*sizeof(ElemType));
s->top=s->base+s->stackSize;
s->stackSize=MAXSIZE*2;
}
*(s->top)=vue;
s->top++;
}
//销毁栈
void Stack_Cleer(SeqStack *s)
{
for(int i=0;i<s->stackSize;i++)
{
free(s->top--);
}
s->base=s->top=NULL;
s->stackSize=0;
}
//计算栈的当前容量 即栈中元素个数
int Stack_Len(SeqStack *s)
{
return (s->top-s->base);
}
//清空栈
void Stack_Clear(SeqStack *s)
{
s->top=s->base;
}
int main()
{
SeqStack s;
InitStack(&s);
char c,e;
printf("请输入中缀表达式:\n");
scanf("%c",&c);
while(c!='#')
{
while(isdigit(c))
{
printf("%c",c);
scanf("%c",&c);
if(c>'9'||c<'0')
{
printf(" ");
}
}
if(c=='(')
{
Push(&s,c);
}
else if(c=='*'||c=='/')
{
if(!Isempty(s))
{
Push(&s,c);
}
else
{
Pop(&s,&e);
if(e=='*'||e=='/')
{
printf("%c ",e);
}
else
{
Push(&s,e);
}
Push(&s,c);
}
}
else if(c=='+'||c=='-')
{
if(!Isempty(s))
{
Push(&s,c);
}
else
{
do
{
Pop(&s,&e);
if(e=='(')
{
Push(&s,e);
}
else
{
printf("%c ",e);
}
}while(e!='('&&Isempty(s));
Push(&s,c);
}
}
else if(c==')')
{
Pop(&s,&e);
while(e!='(')
{
printf("%c ",e);
Pop(&s,&e);
}
}
else if('#'==c)
{
break;
}
else
{
printf("输入错误\n");
}
scanf("%c",&c);
}
while(Isempty(s))
{
Pop(&s,&e);
printf("%c",e);
}
return 0;
}