先了解下字尾表示式和中綴表示式
字尾表示式:運算符號位於兩個運算數之後,如 a b c * + d e / -
其對應的中綴表示式為 a + b * c - d / e
堆疊(stack):具有一定操作約束的線性表,只在一端(棧頂,top)做插入和刪除操作
插入資料:入棧(push)
刪除資料:出戰(pop)
特點:**先出:last in first out(lfo)
棧的順序儲存結構通常由乙個一維陣列和乙個記錄棧頂元素位置的變數組成
#define maxsize 《儲存資料元素的最大個數》
typedef struct snode *stack;
struct snode;
一、入棧和出棧
//入棧操作
void push(stack ptrs,elementtype item)
else
}//出棧操作
elementtype pop(stack ptrs)
else
return (ptrs -> data[(ptrs -> top)--]);
}
如何利用乙個陣列實現兩個堆疊?要求高效的利用空間。
答:使兩個棧分別從陣列的兩頭開始向中間生長,當兩個棧的棧頂指標相遇,表示兩個棧都滿了
#define maxsize 《儲存資料元素的最大個數》
struct dstacks;
s.top1 = -1;
s.top2 = maxsize;
//入棧
void push(struct dstack *ptrs,elementtype item,int tag)
if(tag == 1)
else
//出棧操作
elementtype pop(strut dstack * ptrs,int tag)}
if(tag == 1)
else
return ptrs -> data[(ptrs -> top1)--];
}else
else
}}
堆疊的鏈式儲存實現:棧的鏈式儲存結構實際上是乙個單鏈表,叫做鏈棧,插入和刪除操作只能再鏈棧的棧頂進行,棧頂指標top應該在鍊錶頭部,便於插入和刪除。
typedef struct snode * stack;
struct snode;
stack createstack()
int isempty(stack s)
入棧和出棧操作:
void push(elementtype item,stack s)
elementtype pop(stack s)
else
}
堆疊的應用:中綴表示式求值
基本策略:中綴轉字尾然後求值
1.運算數相對順序不變
2.運算符號順序傳送改變
*需要儲存等待中的運算符號
*要將當前運算符號與等待中最後乙個運算符號比較,如果前乙個運算子優先高,則它出棧,用於計算。
➢從頭到尾讀取中綴表示式的每個物件,對不同物件按不同的情況處理。
①運算數:直接輸出;
②左括號:壓入堆疊:
③右括號:將棧頂的運算子彈出並輸出,直到遇到左括號(出棧,不輸出) ;
④運算子:
若優先順序大於棧頂運算子時,則把它壓棧;
若優先順序小於等於棧項運算子時,將棧頂運算子彈出並輸出:再比
較新的棧頂運算子,直到該運算子大於棧頂運算子優先順序為止,然
後將該運算子壓棧;
⑤若各物件處理完畢,則把堆疊中存留的運算子一-並輸出。
第二章 資料結構 二
知識點 trie樹 並查集,堆的操作 高效地儲存和查詢字串集合的資料結構 const int n 100010 int son n 26 cnt n idx 插入 void insert char str cnt p 以這個點結尾的字元數 查詢 intquery char str return cn...
資料結構 第二章總結
線性表是由n 0 個資料元素組成的有限序列。我們學習了線性表上定義的基本運算 有構造空表 initlist l 求表長 listlength l 取結點 getnode l i 查詢 locatenode l x 插入 insertlist l x,i 刪除 delete l i 還學習了順序表 單...
資料結構第二章總結
線性表簡稱表,是n個具有相同型別的資料元素的有限序列。線性表中資料元素的個數稱為線性表的長度。長度為零時稱為空表。線性表中資料元素的型別是同一的。線性表的順序儲存結構稱為順序表。儲存結構是資料及其邏輯結構在計算機中的表示 訪問結構是在乙個資料結構上對查詢操作的時間效能的一種描述。順序表的類的宣告 c...