棧和佇列(一) 棧的實踐(3) 字尾表示式

2021-07-07 05:27:36 字數 4863 閱讀 5030

/*

*all right resvered .

*檔名稱: 字尾表示式.cpp

*作 者: 鄭兆涵

*棧和佇列(一)——棧的實踐(3)——字尾表示式

*/

問題:利用sqstack.h中棧的基本運算,實現將乙個中綴表示式轉換為對應的字尾表示式的演算法。

程式設計**:

//標頭檔案:sqstack.h,包含定義順序棧資料結構的**、巨集定義、要實現演算法的函式的宣告

#ifndef sqstack_h_included

#define sqstack_h_included

#define maxsize 100

typedef char elemtype;

typedef struct

sqstack; //順序棧型別定義

void initstack(sqstack *&s); //初始化棧

void destroystack(sqstack *&s); //銷毀棧

bool stackempty(sqstack *s); //棧是否為空

int stacklength(sqstack *s); //返回棧中元素個數——棧長度

bool push(sqstack *&s,elemtype e); //入棧

bool pop(sqstack *&s,elemtype &e); //出棧

bool gettop(sqstack *s,elemtype &e); //取棧頂資料元素

void dispstack(sqstack *s); //輸出棧

#endif // sqstack_h_included

//原始檔:sqstack.cpp,包含實現各種演算法的函式的定義

#include #include #include "sqstack.h"

void initstack(sqstack *&s)

void destroystack(sqstack *&s)

int stacklength(sqstack *s) //返回棧中元素個數——棧長度

bool stackempty(sqstack *s)

//標頭檔案:sqstack.h,包含定義順序棧資料結構的**、巨集定義、要實現演算法的函式的宣告

#ifndef sqstack_h_included

#define sqstack_h_included

#define maxsize 100

typedef char elemtype;

typedef struct

sqstack; //順序棧型別定義

void initstack(sqstack *&s); //初始化棧

void destroystack(sqstack *&s); //銷毀棧

bool stackempty(sqstack *s); //棧是否為空

int stacklength(sqstack *s); //返回棧中元素個數——棧長度

bool push(sqstack *&s,elemtype e); //入棧

bool pop(sqstack *&s,elemtype &e); //出棧

bool gettop(sqstack *s,elemtype &e); //取棧頂資料元素

void dispstack(sqstack *s); //輸出棧

#endif // sqstack_h_included

bool push(sqstack *&s,elemtype e)

bool pop(sqstack *&s,elemtype &e)

bool gettop(sqstack *s,elemtype &e)

void dispstack(sqstack *s) //輸出棧

//編寫main函式。進行測試

#include #include #include "sqstack.h"

#define maxop 7

struct //設定運算子優先順序

lpri= ,,,,,,},

rpri= ,,,,,,};

int leftpri(char op) //求左運算子op的優先順序

postexp[i++]='#'; //用#標識乙個數值串結束

}else //為運算子的情況

}} //while (*exp!='\0')

pop(opstack, ch);

while (ch!='=')

//此時exp掃瞄完畢,退棧到'='為止

postexp[i]='\0'; //給postexp表示式新增結束標識

destroystack(opstack);

}int main()

輸出結果:

學習心得:

以後綴表示式為例:

例:p=a * b + ( c - d / e ) * f

則用字尾表示式的形式為:p'=a b * c d e / - f * +

數值表示式的特點:

(1)運算元之間的相對次序不變;

(2)運算子的相對次序變化;

(3)要考慮運算子的優先順序,有無括號的問題。

對於本例解析:p=a * b + ( c - d / e ) * f

(1)用exp字元陣列儲存滿足前面條件的算數表示式

(2)把對應的字尾表示式存放在字元陣列postexp中

(3)用乙個字元陣列op作為棧

具體操作:

(1)提取算數表示式exp中的第乙個元素"a",直接將"a"放入postexp中。

(2)提取算數表示式exp中的第二個元素"*",發現是運算子,則需要進行運算子的優先順序的比較,此時將"*"入棧op,進行壓棧。

(3)提取算數表示式exp中的第三個元素"b",發現不是運算子,則直接放入postexp中。

(4)提取算數表示式exp中的第四個元素"+",發現是運算子,則需要進行運算子的優先順序的比較,此時將"+"入棧op,原先棧內有乙個"*",則將"*"出棧,並放入postexp中,再將"+"入棧,進行壓棧。

(5)提取算數表示式exp中的第五個元素"(",發現是運算子,則需要進行運算子的優先順序的比較,但是因為是"(",所以將"("直接進棧。

(6)提取算數表示式exp中的第六個元素"c",發現不是運算子,則直接放入postexp中。

(7)提取算數表示式exp中的第七個元素"-",發現是運算子,則需要進行運算子的優先順序的比較,此時將"-"入棧op,原先棧內有乙個"+",還有乙個"(",但是優先考慮"()"中的,不需要考慮"("之前的,所以將"-"入棧。

(8)提取算數表示式exp中的第八個元素"d",發現不是運算子,則直接放入postexp中。

(9)提取算數表示式exp中的第九個元素"/",發現是運算子,則需要進行運算子的優先順序的比較,此時將"/"入棧op,原先棧內有乙個"-",所以直接將"/"入棧。

(10)提取算數表示式exp中的第十個元素"e",發現不是運算子,則直接放入postexp中。

(11)提取算數表示式exp中的第十乙個元素")",發現是運算子,則需要進行運算子的優先順序的比較,但是因為是")",所以將"("與")"之間進棧的運算子,依次出棧。

(12)提取算數表示式exp中的第十二元素"*",發現是運算子,則需要進行運算子的優先順序的比較,此時將"*"入棧op,原先棧內有乙個"+",所以直接將"*"入棧。

(13)提取算數表示式exp中的第十三元素"f",發現不是運算子,則直接放入postexp中。

(14)無法再提取算數表示式exp中的元素,則直接將棧op中的元素依次出棧,就能得到結果:p'=a b * c d e / - f * +

(1)

struct  //設定運算子優先順序

lpri= ,,,,,,},

rpri= ,,,,,,};

定義乙個結構體struct,其中ch表示運算子的域,pri表示優先順序的域,並且定義兩個結構體陣列lpri,且進行結構體lpri的初始化。

(2)

int precede(char op1,char op2)  //op1和op2運算子優先順序的比較結果

這是為了判斷取出的元素"ch"是否為運算子,是返回ture,不是返回false。

(5)

void trans(char *exp,char postexp)

//將算術表示式exp轉換成字尾表示式postexp

postexp[i++]='#'; //用#標識乙個數值串結束

}else //為運算子的情況

}} //while (*exp!='\0')

pop(opstack, ch);

while (ch!='=')

//此時exp掃瞄完畢,退棧到'='為止

postexp[i]='\0'; //給postexp表示式新增結束標識

destroystack(opstack);

}

首先定義乙個結構體op,也就是定義棧op,以棧的順序表的形式char乙個data,再定義棧頂元素top,因為是初始化的棧,所以棧頂為空i=0,所以先賦值top=-1,再進top++,用乙個優先順序最小的"="進行壓棧,接下來去處理每乙個字元,while()過程,先判斷是否不是運算子,若不是運算子,是數字,則直接將讀到的數字放到postexp中,通過while(*exp>='0' && *exp<='9')之後,再數字的後面加乙個#,若督導的是運算子,則需要比較當前讀到與棧底運算子的優先順序,再比較出,-1/0/1來,再分別進行其他操作。

字尾表示式 棧

若干行,每行對應乙個中綴表示式 若干行,每行對應乙個由中綴表示式轉換而來的字尾表示式 x a y b z f a b c d m n s t y a b c d e f gxayb zf abc dm n st y abc def g 解題思路 首先如何實現中綴表示式轉換成字尾表示式,方法如下 1....

棧 字尾表示式

看了老師給的部落格,學習了一下,我學的確實很菜啊,仿照寫了乙個可以實現任意數字個數的加括號運算,目前只支援加乙個括號。收穫真的挺大 def to rpn f4 defcompare x,y v return 1 if y else v x v y rpn,operators for i in f4 ...

字尾表示式與棧

stack,操作受限制的線性表,在表的一端進行插入和刪除,先進後出 filo 後進先出 lifo 表尾是棧頂 top 表頭是棧底 bottom top不是指標型別,但習慣稱為棧頂指標,習慣用詞還有push和pop表示入棧和出棧 棧空,top是 1 陣列 或者0,看是怎麼約定的,這裡採用棧空指向0 至...