1. 程式人生 > >字尾表示式轉為中綴表示式

字尾表示式轉為中綴表示式

思路:

(1)先用堆疊將字尾表示式轉化為表示式樹,然後再將樹進行中綴遍歷,如果左右子樹不為空就輸出左右括號。

(2)字尾表示式轉化為表示式樹時要用堆疊進行:

如果是數字(字母)就入棧,如果是運算子就取堆疊的前兩個節點,然後建立新的子樹再將頭結點入棧。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;

struct Node{
    int x;
    struct Node *Left,*Right;
};
typedef 
struct Node* Tree; struct N{ Tree x; struct N* next; }; typedef struct N* Stack; Stack CreateStack() { Stack S=(Stack)malloc(sizeof(struct N)); S->next=NULL; return S; } void Push(Tree x,Stack S) { Stack tp=(Stack)malloc(sizeof(struct N)); tp->x=x; tp->next=S->next; S
->next=tp; } void Pop(Stack S) { Stack tp=S->next; S->next=tp->next; free(tp); } void PostOrder(Tree t) { if(t!=NULL) { PostOrder(t->Left); PostOrder(t->Right); printf("%c",t->x); } } void InOrder(Tree t) { if(t!=NULL) {
if(t->Left!=NULL) printf("("); InOrder(t->Left); printf("%c",t->x); InOrder(t->Right); if(t->Right!=NULL) printf(")"); } } Tree Top(Stack S) { return S->next->x; } int main(void) { int len,n,i,x; Tree tp,p,h,t1,t2; Stack S=CreateStack(); char str[120]; gets(str); //printf("%s",str); len=strlen(str); for(i=0;i<len;i++) { Tree t=(Tree)malloc(sizeof(struct Node)); if(t==NULL) printf("Out of Space!!!\n"); t->x=str[i]; if(str[i]>='a'&&str[i]<='z') { t->Left=NULL; t->Right=NULL; Push(t,S); } else { t1=Top(S); Pop(S); t2=Top(S); Pop(S); t->Left=t2; t->Right=t1; Push(t,S); } } tp=Top(S); Pop(S); InOrder(tp); //PostOrder(tp); return 0; } //ab+cde+**
View Code