1. 程式人生 > >利用字尾表示式構建一顆表示式樹——C語言實現

利用字尾表示式構建一顆表示式樹——C語言實現

表示式樹是指所有葉子結點為運算元,根節點和中間節點為操作符的樹。如果操作符是二元運算子,那麼構建出來的二叉樹為為一顆二叉樹。

構建一顆表示式的演算法如下:

從第一個符號開始,一次讀取一個字尾表示式中的符號。如果符號是運算元,那麼建立一個單節點樹,並將一個指向它的指標入棧(注意這裡棧中存的是指標)。如果符號是操作符那麼 就從棧彈出兩顆樹的指標,以當前讀到的操作符為根節點構建一顆樹。最後再將該樹的根節點入棧。迴圈此過程,知道讀完並處理完所有符號(字尾表示式中的符號)。



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);	
	}
}