計算機如何進行表示式求值?【例】算術表示式5+6/2-3*4
不同運算符號優先順序不一樣
【例】6 2/3-4 2*+=?
字尾表示式求值策略:從做向右掃瞄,逐個處理運算數和運算符號
遇到運算數,如何記住目前還未參與運算的數?啟示:需要有種儲存方法,能順序儲存運算數,並在需要時「倒序」輸出。遇到運算符號,對應的運算數是什麼?
堆疊(stack):具有一定操作約束的線性表,只在一端(棧頂,top)做插入、刪除
堆疊的抽象資料型別描述
型別名稱:堆疊(stack)
資料物件集:乙個有0個或多個元素的有窮線性表
操作集:長度為maxsize的堆疊s∈
stac
k,堆疊
元素it
em∈e
leme
ntty
pe
stack createstack(int maxsize):生成空堆疊,其最大長度為maxsize;
int isfull(stack s,int maxsize):判斷堆疊s是否已滿;
void push(stack s,elementtype item):將元素item壓入堆疊;
int isempty(stack s):判斷堆疊s是否已滿;
elementtype pop(stack s):刪除並返回棧頂元素;
push和pop可以穿插交替進行;
push(s,a),push(s,b),push(s,c), pop(s),pop(s),pop(s)堆疊輸出是cbapush(s,a),push(s,b),push(s,c), pop(s),pop(s),pop(s)堆疊輸出是cba
棧的順序儲存結構通常由乙個一維陣列和乙個記錄棧頂元素位置的變數組成。
#define maxsize《儲存資料元素的最大個數》
typedef
struct snode *stack;
struct snode
void push(stack ptrs,elementtype item)else
}
elementtype pop(stack ptrs)else
}
【例】請用乙個陣列實現兩個堆疊,要求最大地利用陣列空間,使陣列只要有空間入棧操作就可以成功。
【分析】使兩個棧分別從陣列的兩頭開始向中間生長;當兩個棧的棧頂指標相遇時,表示兩個棧都滿了。
#define maxsize《儲存資料元素的最大個數》
struct dstacks;
s.top1=-1;
s.top2=maxsize;
//tag作為區分兩個堆疊的標誌,取值為1 2
void push(struct dstack *ptrs,elementtype item,int tag)
if(tag==1)
ptrs->data[++(ptrs->top1)]=item;
else
ptrs->data[--(ptrs->top2)]=item;}}
elementtype pop(struct dstack *ptrs,int tag)
else
return ptrs->data[(ptrs->top1)--];
}else
else
return ptrs->data[(ptrs->top2)++];}}
棧的鏈式儲存結構實際上就是乙個單鏈表,叫做鏈棧。插入和刪除操作只能在鏈棧的棧頂進行。棧頂指標只能在鍊錶的表頭
typedef
struct snode *stack;
struct snode;
stack createstack()
int isempty(stack s)
void push(stack s,elementtype item)
elementtype pop(stack ptrs)else
}
從左到右讀入字尾表示式的各項(運算子或運算數)中綴表示式求值
基本策略:將中綴表示式轉換為字尾表示式,然後求值【例】:2+9/3-5 -> 2 9 3/ + 5 -
運算數相對位置不變
運算符號順序發生改變
【例】 a*(b+c)/d=? a b c+ * d /
時間複雜度:t(n)=o(n)
中綴表示式如何轉換為字尾表示式總結
從頭到尾讀取中綴表示式的每個物件,對不同物件按不同情況處理。運算數:直接輸出;
左括號:壓入堆疊;
右括號:將棧頂的運算子彈出並輸出,直到遇到左括號(括號出棧不輸出);
運算子:
筆記 資料結構 棧
特性 先進後出,不可訪問索引,只能逐漸推入推出 介面inte ce istackds 得到棧中資料個數,屬性 int getlength 同上,方法型別的 bool isempty 檢驗是否為空 void clear 清空 void push t item 推入資料 t pop 獲得棧頂資料並刪去 ...
筆記 資料結構 棧
2 鏈式儲存 3例題4應用 線性表的特點 1 有限,線性表的元素個數稱為線性表的長度 2 有序,乙個接著乙個,除了首位外,每個元素有個前驅元素和乙個後繼元素,元素間是一對一的關係。棧是限定僅在表尾進行插入和刪除的線性表 棧就像是一摞盤子,每次洗碗時將盤子乙個接著乙個向上疊,使用時從上往下乙個乙個取,...
演算法筆記 資料結構 堆
堆是一棵完全二叉樹,樹中每個結點的值都不小於 或者不大於 其左右孩子結點的值 對於給定初始序列,如何建堆?給定陣列 85,55,82,57,68,92,99,98,66,56 建堆過程如下 利用陣列來儲存完全二叉樹,這樣結點就按層序儲存與陣列中,其中第乙個結點將儲存於陣列的1號位,並且陣列i號位表示...