棧與佇列(1)

2021-10-18 11:40:27 字數 2112 閱讀 8048

棧:限定僅在表尾進行插入和刪除操作的線性表

棧頂:允許插入和刪除的一端

棧底:不允許插入和刪除的一端

空棧:不含任何資料元素的棧

後進先出的線性表,lifo結構。

進棧:棧的插入

出棧:棧的刪除

元素數量多,出棧的變化會更多。

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的元素個數

> endadt

棧是特殊的線性表,後人先出,只能在棧頂(一端)進行插入和刪除

typedef

int selemtype;

/*selemtype型別根據實際情況而定,這裡假設為int*/

typedef

struct

sqstack;

進棧操作push,**實現

/*插入元素e為新的棧頂元素*/

status push

(sqstack *s,selemtype)

s->top++

;//棧頂指標加一

s->data[s->top]

=e;//將新插入元素賦值給棧頂空間

returrn ok;

}

出棧pop,**實現:

status pop

(sqstack *s,selemtype)

*e=s->data[s->top]

;//把要刪除的棧頂元素賦值**移)給*e

s->top--

;//棧頂指標減一

return ok;

}

兩個同型別的棧,如果分開儲存可能會有乙個已經滿了,而另乙個空間被浪費了,所以可以兩棧共享空間,從兩棧兩端向中間儲存。

需要標識是哪個棧,stacknumber

棧滿標識:兩個棧頂之間差一:top1+1=top2.

/*兩棧共享空間結構*/

typedef

struct

sqdoublestack

/*插入元素e為新的棧頂元素*/

status push

(sqdoublestack *s,

int stacknumber)

/*若棧不空,則刪除s的棧頂元素,用e返回其值,並返回?;否則返回error*/

status pop

(sqdoublestack *s,

int stacknumber)

else

if(stacknumber==2)

return ok;

}

兩個棧有相反需求關係時,兩棧共享空間有作用。

棧與佇列 建立棧 佇列

陣列棧 完成stack createstack int maxelements 函式,該函式建立乙個棧,maxelements為與分配的棧空間大小 棧可用空間為array 0,maxelements 1 typedef int elemtype struct stackrecord typedef ...

棧與佇列1 設計getMin功能的棧

設計棧,實現基本功能的前提下,實現返回棧內最小元素的功能 1.push,pop,getmin 複雜度為o 1 2.允許使用現成棧結構 使用兩個棧,stackdata和stackmin,stackmin負責存最小值 共同點 都用stackmin儲存stackdata的最小值,時間複雜度均為o 1 空間...

棧與佇列 課後練習1

判斷棧輸出順序正確與否 問題描述 給定乙個棧,其中最多儲存m個資料。將n個資料以1,2,3,n的順序壓棧,然後再隨機彈棧。判斷一下哪些是有可能的彈棧順序,而哪些不是。例如m是5,n是7,我們可以得到1,2,3,4,5,6,7的彈棧順序,而不能得到3,2,1,7,5,6,4這樣的彈棧順序。m,n 10...