中序转换成后序:对每一个字符进行判断,并用一个栈存优先级较高的字符,符合规则的进队列,最后队列从队首至队尾输出。
中序转换成后序:先用一个栈ks存下整个表达式,然后从栈顶(表达式最尾端)开始判断, 一个栈qs存优先级高的字符,符合规则的进入栈os。ks表达式判断完后,qs中还会有字符未出栈,需要全部进行出栈处理。完毕后,输出栈os。
写的比较复杂,也怪老师的给的太繁琐。
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#define stacksize 100
#define queuesize 100
using namespace std;
typedef char datatype;
//定义队列
typedef struct
{
char data[100];
int front,rear;
}seqqueue;
//定义栈
typedef struct
{
datatype data[100];
int top;
}seqstack;
//初始化队列
void initqueue(seqqueue *q)
{
q->front=0;
q->rear=0;
}
//队列是否为空
int queueempty(seqqueue *q)
{
if(q->front==q->rear)
return 1;
else
return 0;
}
//入队列
void enqueue(seqqueue *q,datatype x)
{
if((q->rear+1)%queuesize==q->front)
cout<<"queue overflow"<<endl;
else
{
q->data[q->rear]=x;
q->rear=(q->rear+1)%queuesize;
}
}
//出队列
datatype dequeue(seqqueue *q)
{
if(q->front==q->rear)
cout<<"queue empty"<<endl;
else
{
datatype x;
x=q->data[q->front];
q->front=(q->front+1)%queuesize;
return x;
}
// return NULL;
}
//初始化栈
void initstack(seqstack *s)
{
s->top=0;
}
//入栈
void push(seqstack *s,datatype x)
{
if(s->top==stacksize)
cout<<"stack overflow"<<endl;
else
{
s->data[s->top]=x;
s->top=s->top+1;
}
}
//出栈
datatype pop(seqstack *s)
{
if(s->top==0)
cout<<"stack underflow"<<endl;
else
return s->data[--s->top];
}
//取栈顶元素
datatype gettop(seqstack *s)
{
if(s->top==0)
return false;
else
return s->data[s->top-1];
}
//给运算符排序
int priority(datatype op)
{
switch(op)
{
case '(':
case ')':
case '#': return 0;
case '-':
case '+': return 1;
case '*':
case '/': return 2;
}
return -1;
}
//中转后
void intopostexp()
{
cout<<"中序转后序表达式"<<endl;
cout<<"输入:"<<endl;
seqqueue *q;
seqqueue postq;
q=&postq;
initqueue(q);
seqstack os;
char c,t;
seqstack *s;
s=&os;
initstack(s);;
push(s,'#');
do
{
c=getchar();
switch(c)
{
case ' ': break;
case '()':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': enqueue(q,c);
break;
case '(':
push(s,c);
break;
case')':
case'#':
do
{
t=pop(s);
if(t!='('&&t!='#')
enqueue(q,t);
}while(t!='('&&s->top!=0);
break;
case '+':
case '-':
case '*':
case '/':
while(priority(c)<=priority(gettop(s)))
{
t=pop(s);
enqueue(q,t);
}
push(s,c); break;
}
}while(c!='#');
while(!queueempty(q))
cout<<dequeue(q)<<" ";
cout<<endl;
}
//中转前
void xiang()
{
cout<<"中序转前序表达式"<<endl;
cout<<"输入:"<<endl;
seqstack os,ks,qs;
seqstack *s,*k,*q;
s=&os;
k=&ks;
q=&qs;
initstack(q);
initstack(s);
initstack(k);
char abc;
push(k,'#');
push(q,'#');
push(s,'#');
while(cin>>abc)
{
push(k,abc);
if(abc=='#') break;
}
pop(k);
char c,t;
do
{
c=pop(k);
switch(c)
{
case ' ': break;
case '()':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': push(s,c);
break;
case ')':
push(q,c);
break;
case'(':
case'#':
do
{
t=pop(q);
if(t!=')'&&t!='#')
push(s,t);
}while(t!=')'&&s->top!=0);
break;
case '+':
case '-':
case '*':
case '/':
while(priority(c)<=priority(gettop(q)))
{
t=pop(q);
push(s,t);
}
push(q,c);break;
}
}while(gettop(k)!='#');
while(gettop(q)!='#')
{
t=pop(q);
push(s,t);
}
while(gettop(s)!='#')
{
char t=pop(s);
cout<<t<<" ";
}
cout<<endl;
}
int main()
{
//5+6-2*(5-6)-6/2#
intopostexp();
xiang();
return 0;
}