中序表示式轉換為後序、前序表示式(非計算)
阿新 • • 發佈:2018-11-10
中序轉換成後序:對每一個字元進行判斷,並用一個棧存優先順序較高的字元,符合規則的進佇列,最後佇列從隊首至隊尾輸出。
中序轉換成後序:先用一個棧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;
}