棧的鏈式儲存結構
棧的應用———遞迴
佇列棧(stack)是限定僅在表位進行插入和刪除操作的線性表。
adt 棧(stack)
data
同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。
operation
initstack (
*s):初始化操作,建立乙個空棧s;
destroystack (*s)
:若棧存在,則銷毀它;
clearstack(*s)
:將棧清空。
stackempty(s): 若棧為空,則返回true,否則false。
gettop(s,
*e): 若棧存在且非空,用e返回s的棧頂元素。
push(*s, e)
: 若棧s存在,插入新元素e到棧s中,並成為棧頂元素。
pop(*s,
*e):刪除棧s中棧頂元素,並用e返回其值。
stacklength(s):返回棧s的個數。
當棧存在乙個元素時,top等於0;,因此通常把空棧的判定條件定為top等於-1。
**:
typedef
int selemtype;
typedef
struct
sqstack;
當棧有兩個元素,top=1; 棧有5個元素,top=4;空棧,top=-1。
進棧操作
status push
(sqstack *s, selemtype e)
s->top++
; s->data[s->top]
=e;//將新元素賦值給棧頂空間
return ok;
出棧操作stastus pop
(sqstack *s, seletype *e)
兩棧共享空間
陣列有兩個端點,兩個棧有兩個棧底,讓乙個棧的棧底為陣列的始端,即下標為0處,另乙個棧為棧的末端,即下標為陣列長度n-1處。這樣,兩個棧如果增加元素,就是兩端點向中間延伸。
若棧2是空棧,棧1的top1等於n-1時,就是棧1滿了。反之,當棧1為空棧時,top2等於0時,為棧2滿。兩個棧見面之時,也即是兩個指標之間相差1時,即top1 +1 == top2為棧滿。
**:
typedef
struct
sqdoublestack;
對於兩棧共享空間的push
方法,我們除了要插入元素值引數外,還需要有乙個判斷是棧1還是棧2的棧號引數stacknumber。
status push
(sqdoublestack *s, selemtype e,
int stacknumber)
兩棧共享空間的pop
方法,引數就之時判斷棧1棧2的引數stacknumber
**:
status push
(sqdoublestack *s, selemtype e,
int stacknumber)
else
if(stacknumber==1)
return ok;
}
簡稱鏈棧。
通常對於鏈棧來說,是不需要頭結點的。基本不存在棧滿的情況,除非記憶體已經沒有可以使用的空間了。
對於空棧來說,鍊錶原定義是頭指標指向空,那麼鏈棧的空其實就是top=null的時候。
typedef
struct stacknode
stacknode,
*linkstackptr;
typedef
struct linkstack
linkstack;
進棧操作status push
(linkstacks *s, selemtype e)
出棧操作status pop
(linkstack *s, selemtype *e)
如果棧的使用過程中元素變化不可預料,有時很小,有時非常發,那麼組好吃用鏈棧,繁殖,如果變化在可控範圍內,建議使用順序棧會更好一點。
我們把乙個直接呼叫自己或通過一系列的呼叫語句間接得呼叫自己的函式,稱作遞迴函式。
斐波那契數列
# inclued
using namespace std;
intfbi
(int i)
intmain()
佇列(queue)是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
是fifo(first in first out)的線性表。
adt 佇列(queue)
data
同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。
operation
initqueue
(*q)
: 初始化操作,建立乙個空佇列q。
destoryqueue
(*q)
:若佇列q存在,則銷毀它。
clearqueue
(*q)
:將佇列q清空。
queueempty
(q):若佇列q為空,返回true,否則返回false。
gethead
(q,*e)
:若佇列q存在且非空,用e返回佇列q的隊頭元素。
enqueue
(*q, e)
:若佇列q存在,插入新元素e到佇列q中並成為隊尾元素。
dequeue
(*q, e)
:刪除佇列q中的隊頭元素,並用e返回其值。
queuelength
(q):返回佇列q的元素個數。
endadt
把佇列的頭尾相接的順序儲存結構稱為迴圈佇列。
佇列滿的條件是**(rear+1)%queuesize == fornt**
計算佇列長度公式為
(rear-front+queue)%queuesize
**:
typedef
int qelemtype
typedef
struct
sqqueue;
迴圈佇列的初始化**:
status initqueue
(sqqueue *q)
迴圈佇列的入隊操作**:
status enqueue (sqqueue *q, qelemtype e)
迴圈佇列的出隊操作
status dequeue (sqqueue *q, qelemtype *e)
佇列的鏈式儲存結構,其實就是線性表放單鏈表,只不過它只能尾進頭出。
將隊頭指標指向鏈佇列的頭結點。
**:
typedef
int qelemtype;
typedef
struct qnode
qnode,
*queueptr;
typedef struct //佇列的鍊錶結構
linkqueue;
入隊操作status enqueue (linkqueue *q, qelemtype e)
出隊操作
出隊操作時, 就是頭結點的後繼結點出隊,將頭結點的後繼改為它後面的結點。若煉表處頭結點外只剩乙個元素時,則需要將rear指向頭結點。
**:
status dequeue
(linkqueue *q, qelemtype *e)
{ queueptr p;
if(q->front == q->rear)
return error;
p=q->front->next;
//將刪除的隊頭結點暫存給p
*e= p->data;
// 將欲刪除的隊頭結點賦值給e
q->front->next = p->next;
// 將原佇列頭結點後繼p->next賦值給頭結點後繼
if(q->rear == p)
//若隊頭是隊尾,則刪除後將rear指向頭結點
q->rear = q -> front;
free
(p);
return ok;
資料結構與演算法(棧與佇列)
棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,他的特點在於只能允許在容器的一端 稱為棧頂端指標,英語top 進行加入資料 英語push 和輸出資料 英語pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問...
佇列 棧(資料結構與演算法)
佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...
資料結構與演算法分析 棧與佇列
以下是對資料結構中的棧和佇列的一些總結 一 棧 棧 stack 是一種特殊的線性表,有後進先出 last in first out,lifo 的性質,且只能從線性表的一段進行插入和刪除元素等操作。棧的常用操作有 進棧 出棧 取棧頂 將棧置空 判斷棧是否為空 判斷棧是否已滿等等。由於棧也屬於線性表,因...