/*
*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 至...