堆疊的用途:函式呼叫、遞迴、回溯演算法、表示式求值例1:計算機如何進行表示式求值?對算術表示式(中綴表示式)
例2:求字尾表示式
由兩類物件構成:運算數和運算符號(不同運算符號優先順序不一樣)
結論:需要有種儲存方法,能順序的儲存運算數,並在需要的時候「倒序」輸出,此時堆疊就起作用了。
堆疊的抽象資料型別描述定義:具有一定操作約束的線性表,只在一端(棧頂,top)做插入(入棧push)、刪除(出棧pop),後入先出(last in first out,lifo)
資料物件集:乙個有0個或多個元素的又窮線性表
操作集:長度為maxsize的堆疊
線性表的基本操作(堆疊實現):stack createstack(int maxsize):生成乙個最大長度為maxsize的空堆疊
int isfull(stack s,int maxsize):判斷堆疊s是否已滿
void push(stack s,elementtype item):在堆疊中壓入item元素
int isempty(stack s):判斷堆疊s是否為空#include typedef int elementtype;
#define maxsize 100
#define error
typedef struct snode *stack;
struct snode;
void push(stack ptrs, elementtype item)
else
}
elementtype pop(stack s):刪除並返回棧頂元素
elementtype pop(stack ptrs)
else
return (ptrs->data[(ptrs->top)--]); //將元素自上而下乙個個彈出
}
棧的順序儲存(陣列方式)實現:通常由乙個一維陣列和乙個記錄棧頂元素位置的變數組成。struct dstacks;
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, elementtype item, int tag)
else
return ptrs->data[(ptrs->top1)--]; //從前往後彈出元素
} else
else
return ptrs->data[(ptrs->top2)++]; //從後往前彈出元素
}}
棧的鏈式儲存(鍊錶方式)實現:即單鏈表,叫鏈棧。插入和刪除操作只能在鏈棧頂進行。棧頂指標top應在鍊錶的頭部堆疊初始化,建立空棧
堆疊元素的插入#include #include typedef int elementtype;
#define maxsize 100
#define error
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.左括號:壓入堆疊
3.右括號:將棧頂的運算子彈出並輸出,直到遇到左括號(出棧,不輸出)
4.運算子:如果優先順序大於棧頂運算子時,則把他壓棧;
如果優先順序小於棧頂運算子時,將棧頂運算子彈出並輸出;再比較新的棧頂運算子,知道該運算子大於棧頂運算子優先順序為止
5.如果各物件處理完畢,則把堆疊中存留的運算子一併輸出。
資料結構(二) 線性表
線性表是最簡單最常用的資料結構,是一種典型的線性儲存結構。定義 線性表是由n n 0 個資料元素 結點 a1 a 2 an 組成的有限序列。n為表的長度。當n 0,為 空表 n 0時,為 a1,a 2,an 邏輯特徵 非空的線性表只有乙個頭結點,也只有乙個終結點,頭結點只有乙個直接後繼結點,而沒有直...
mysql 線性表 資料結構(二)線性表 鍊錶
通常情況下,鏈結可分為單鏈表 雙向鍊錶和迴圈鍊錶三種常用型別。一 單鏈表基本操作的實現 使用鏈式儲存結構來實現的線性表稱為鍊錶。首元結點 頭結點 頭指標 空指標。1.單鏈表的型別定義 typedef struct lnode 結點型別 lelemtype data 資料域 struct lnode ...
實驗二 線性表的基本操作
一 實驗目的 1 會定義線性表的順序儲存型別。2 熟悉c或c 程式的基本結構,掌握程式中的使用者標頭檔案 實現檔案和主檔案之間的相互關係及各自的作用。3 熟悉對線性表的一些基本操作和具體的函式定義。4 熟悉turboc或vc操作環境的使用以及多檔案程式的輸入 編輯 除錯和執行的全過程。二 實驗內容 ...