1. 程式人生 > 其它 >76-實現中綴轉字尾(對棧的應用)

76-實現中綴轉字尾(對棧的應用)

技術標籤:C語言其他

首先對棧的編寫

#define INITSZIE 10

typedef int ElemType;

typedef struct stack
{
	ElemType *data;//指向儲存空間的首地址 棧底指標
	int       top;//棧頂指標
	int      size;//棧儲存空間的大小,為了擴容準備 
}Stack;

本程式所需要的標頭檔案

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>

以下是對編寫中綴轉字尾函式時需要的其他功能函式的書寫

void InitStack(Stack *st)//初始化棧 
{
	if(st==NULL) exit(0);
	st->data=(ElemType *)malloc(sizeof(ElemType)*INITSZIE);
	if(st->data==NULL) exit(0);
	st->top=0;//有兩種設定 0 -1
	st->size=INITSZIE; 
}
static bool AppendSpace(Stack *st)//申請新空間 擴容 
{
	ElemType *new_space=(ElemType *)malloc(sizeof(ElemType)*st->
size*2); if(new_space==NULL) return false; for(int i=0;i<st->top;++i) { new_space[i]=st->data[i]; } free(st->data); st->data=new_space; st->size*=2; return true; } bool IsFull(Stack *st)//判滿 { return st->top==st->size; } bool Push(Stack *st,ElemType val)//增加資料 { if
(st==NULL) exit(0); if(IsFull(st)) { if(!AppendSpace(st)) { return false; } } st->data[st->top++]=val; return true; } bool IsEmpty(Stack *st)//判空 { return st->top==0; } bool Pop(Stack *st)//取出資料 { if(st==NULL) exit(0); if(IsEmpty(st)) { return false; } st->top--; return true; } //沒有通過top返回值返回棧頂元素,而是通過一個引數將棧頂元素返回 bool Top(Stack *st,ElemType *val) { if(st==NULL) exit(0); if(IsEmpty(st)) return false; *val=st->data[st->top-1]; return true; } void DestroyStack(Stack *st)//銷燬 { if(st==NULL) exit(0); free(st->data); st->data=NULL; st->size=st->top=0; }

然後是對中綴轉字尾函式的書寫和註釋

void InfixToSuffix(const char *str)
{
	if(str==NULL) exit(0);
	Stack st;
	InitStack(&st);
	int tmp=0;
	while(*str!='\0')//從左到右依次遍歷中綴表示式 
	{
		if(*str==' ')//遇到空格跳過去 
		{
			str++;
			continue;//提前結束此次迴圈進入下一次 
		}
		if(isdigit(*str))
		//如果是數字,則直接輸出 
		{
			printf("%c",*str);
			if(!isdigit(*(str+1)))//處理兩位及以上的數字 
			{
				printf(" ");
			}
		}
		else if(*str=='(')
		//如果是左括號,則直接入棧 
		{
			Push(&st,*str);
		}
		else if(*str==')')
//如果是右括號,出棧並輸出,直到遇到第一個左括號 
		{
			while(1)
			{
				Top(&st,&tmp);
				Pop(&st);
				if(tmp=='(') break;
				printf("%c ",tmp);
			}
		}
		else if(*str=='+'||*str=='-')
//如果是+或者-,直接出棧並輸出,直到棧空或者左括號(不出),然後將當前符號入棧 
		{
			while(!IsEmpty(&st))
			{
				Top(&st,&tmp);
				if(tmp=='(') break;
				printf("%c ",tmp);
				Pop(&st);
		    }
		    Push(&st); 
		}
		else if(*str=='*'||*str=='/')
//如果是*或者/,直接出棧,直到棧空或者左括號(不出),或者+,-(不出),然後將當前符號入棧 
		{
			while(!IsEmpty(&st))
			{
				Top(&st,&tmp);
				if(tmp=='('||tmp=='+'||tmp=='-') break;
				printf("%c ",tmp);
				Pop(&st);
			}
			Push(&st,*str);
		}
		else//若以上的條件都不符合,則打印出錯誤 
		{
			printf("Infix is error\n");
			return;
		}
	    str++;
    }
    while(!IsEmpty(&st))
//中綴表示式遍歷結束,將棧中的所有元素全部彈出並輸出 
    {
    	Top(&st,&tmp);
    	printf("%c ",tmp);
    	Pop(&st);
	}
	printf("\n");
}

最後書寫主函式,編譯執行程式。

int main()
{
	const char *str="9 + (3-1) * 3+ 10 / 2";
	InfixToSuffix(str);
	return 0;
}

執行結果如圖所示
在這裡插入圖片描述