利用字尾表示式構建一顆表示式樹——C語言實現
阿新 • • 發佈:2018-12-01
表示式樹是指所有葉子結點為運算元,根節點和中間節點為操作符的樹。如果操作符是二元運算子,那麼構建出來的二叉樹為為一顆二叉樹。
構建一顆表示式的演算法如下:
從第一個符號開始,一次讀取一個字尾表示式中的符號。如果符號是運算元,那麼建立一個單節點樹,並將一個指向它的指標入棧(注意這裡棧中存的是指標)。如果符號是操作符那麼 就從棧彈出兩顆樹的指標,以當前讀到的操作符為根節點構建一顆樹。最後再將該樹的根節點入棧。迴圈此過程,知道讀完並處理完所有符號(字尾表示式中的符號)。
C語言實現的程式碼如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node{ int data; struct Node *right; struct Node *left; }BTNode; BTNode* CreatExpressionTree(char data[],int num); void PostOrder_LDR(BTNode *root); void PostOrder_DLR(BTNode *root); void PostOrder_LRD(BTNode *root); int main(void) { BTNode *root=NULL; char data[]={"ab/cd*+ef/+g+"};//任意的字尾表示式 int num; num=strlen(data); root=CreatExpressionTree(data,num); //構造出表示式樹後以不同的形式輸出,觀察結果 printf("後序遍歷結果為:"); PostOrder_LRD(root); printf("\n中序遍歷結果為:"); PostOrder_LDR(root); printf("\n先序遍歷結果為:"); PostOrder_DLR(root); return 0; } //構造表示式樹的函式 核心程式碼 BTNode* CreatExpressionTree(char data[],int num) { BTNode *p=NULL; int i=0; BTNode* Stack[5]; int top=-1; for(i=0;i<num;i++){ p=(BTNode *)malloc(sizeof(BTNode)); p->right=p->left=NULL; p->data=data[i]; if(p->data<=122 && p->data>=97){//p->data為小寫字母 Stack[++top]=p; } else{ p->right=Stack[top--]; p->left=Stack[top--]; Stack[++top]=p; } } return Stack[0]; } void PostOrder_LDR(BTNode *root) //中序遍歷 { if(root){ PostOrder_LDR(root->left); printf("%c ",root->data); PostOrder_LDR(root->right); } } void PostOrder_DLR(BTNode *root) //先序遍歷 { if(root){ printf("%c ",root->data); PostOrder_DLR(root->left); PostOrder_DLR(root->right); } } void PostOrder_LRD(BTNode *root) //後序遍歷 { if(root){ PostOrder_LRD(root->left); PostOrder_LRD(root->right); printf("%c ",root->data); } }