1. 程式人生 > >中序表示式轉換為後序、前序表示式(非計算)

中序表示式轉換為後序、前序表示式(非計算)

中序轉換成後序:對每一個字元進行判斷,並用一個棧存優先順序較高的字元,符合規則的進佇列,最後佇列從隊首至隊尾輸出。
中序轉換成後序:先用一個棧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; }