【问题描述】
输入一个中缀表达式,表达式中有+、-、*、/四种运算以及(、),表达式中的其他符号为大写的字母, 所有符号均为半角。实现一个算法,得到相应的后缀表达式。
【输入形式】
一个式子的中缀表达式,以#结束
【输出形式】
相应的后缀表达式
【样例输入】
A*(B-C)/D+E#
【样例输出】
ABC-*D/E+
【评分标准】
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct QNode
{
char data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S)
{
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base) exit(-1);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int Push(SqStack &S,char e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base) exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack&S,char &e)
{
if(S.top==S.base)
return -1;
e=*--S.top;
return 1;
}
int GetTop(SqStack&S,char &e)
{
if(S.top==S.base)
return 0;
e=*(S.top-1);
return 1;
}
int InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) exit(-1);
Q.front->next=NULL;
return 1;
}
int EnQueue(LinkQueue&Q,char e)
{
QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
if(!p) exit(-2);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return 1;
}
int DeQueue(LinkQueue &Q,char &e)
{
if(Q.front==Q.rear) return 0;
QueuePtr p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return 1;
}
int YuPop(SqStack &S,char c)
{
char e;
if(GetTop(S,e)==0)
return 1;
else
{
if(c=='('||((c=='+'||c=='-'||c=='*'||c=='/')&&e=='(')||((c=='*'||c=='/')&&(e=='+'||e=='-')))
return 1;
else //if(((c=='+'||c=='-')&&e!='(')||((c=='*'||c=='/')&&(e=='*'||e=='/')))
return 0;
}
}
int main()
{
SqStack S;
LinkQueue Q;
InitStack(S);
InitQueue(Q);
char c,c1;
c=getchar();
while(c!='#')
{
if(c=='('||c=='+'||c=='-'||c=='*'||c=='/')
{
if(YuPop(S,c))
Push(S,c);
else
{
do
{ Pop(S,c1);
EnQueue(Q,c1);
}while(YuPop(S,c)==0);
Push(S,c);
}
}
else if(c==')')
while(1)
{
Pop(S,c1);
if(c1=='(')
break;
EnQueue(Q,c1);
}
else
EnQueue(Q,c);
c=getchar();
}
while(S.base!=S.top)
{
Pop(S,c1);
EnQueue(Q,c1);
}
while(DeQueue(Q,c1)==1)
printf("%c",c1);
}