76-實現中綴轉字尾(對棧的應用)
阿新 • • 發佈:2020-12-10
首先對棧的編寫
#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;
}
執行結果如圖所示