資料結構 棧與佇列

2021-09-28 11:11:15 字數 4163 閱讀 2297

1.順序棧

基本操作:

typedef

int elemtype;

//定義:順序棧//

typedef

struct

sqstack;

//判空//

bool

stackempty

(sqstack s)

//進棧//

bool

push

(sqstack &s , elemtype x)

//出棧操作

bool

pop(sqstack &s , elemtype &x)

//讀取棧頂元素

bool

gettop

(sqstack s , elemtype &x)

(易混問題)指標問題:入棧:指標先移動,後賦值進來:先告訴東西往**放,再放東西。

出棧:先賦值出去,後移動指標:先取出來東西,再移動指標。

2.共享棧

頭尾都是乙個入棧的口,最後指標相鄰則判滿;指標移動和順序棧的要求一致,用的少。

typedef

int elemtype;

//定義:共享棧//

typedef

struct

sqstack;

//判滿//

bool

stackfull

(sqstack s)

//進棧//

bool

push

(sqstack &s , elemtype x ,

int stacknum)

//出棧操作

bool

pop(sqstack &s , elemtype &x ,

int stacknum)

//讀取棧頂元素

bool

gettop

(sqstack s , elemtype &x ,

int stacknum)

3.鏈棧

防上溢。

typedef

int elemtype;

//鏈棧結點的定義

typedef

struct snodesnode ,

*slink;

//鏈棧的結點

//鏈棧的定義

typedef

struct linkstacklinkstack;

//進棧

bool

push

(linkstack *s , elemtype x)

//出棧操作

bool

pop(linkstack *s , elemtype x)

1.基本佇列

2.迴圈佇列

typedef

int elemtype;

//迴圈佇列的定義

typedef

struct

sqqueue;

//入隊操作//

bool

enqueue

(sqqueue &q , elemtype x)

//出隊//

bool

dequeue

(sqqueue &q , elemtype &x)

(常考問題)判滿問題:1.在迴圈佇列中,q.front指向了第乙個元素,q.rear則指向了最後乙個元素的後一位,一旦滿了,勢必導致指標溢位。同時又不能像棧一樣再開闢空間,因為前面的資源沒有用完啊(你有什麼臉再讓人家開新的空間╮(╯▽╰)╭)。為了充分利用好前面的空位,所以出現了迴圈佇列。

2.迴圈佇列的問題在於,如果q.front == q.rear話,居然會出現分別不清到底現在是滿的的空的這種問題。(這個問題有點像時鐘,給你個時鐘,你說現在是14:00還是2:00。。分不清的)

所以就有了下面的這幾種方法。

方法1:犧牲乙個空間滯空。

1.若q.rear的下乙個(即 q.rear+1 )指標指向的是q.front,則認為是滿了。

2.空的話依舊是q.front == q.rear,即為剛開始的時候。

//隊滿

//這種方法可以「歸0」,滿了乙個「輪迴maxsize」,q.rear+1 就回到起點。

(q.rear +1)

% maxsize == q.front

//隊空

q.front == q.rear

//隊中元素個數

(q.rear - q.front + maxsize)

% maxsize

//刪除

status dequeue

(sequeue &q , qelemtype &e)

方法二:增加乙個隊滿元素數目

//隊滿

q.size == maxsize

//隊空

q.size ==

0//隊伍大小

mazsize

方法三:增加tag標記

//插入後隊滿:

if(tag ==

0&& q.front == q.rear)

return

true

;//插入後隊空:

if(tag ==

1&& q.front == q.rear)

return

false

;

3.鏈式佇列

1.在刪除模組的時候,需要保證鏈佇列的q.rear 指標不會丟失。

2.該佇列帶頭節點。

typedef

int elemtype;

//鏈式佇列結點的定義

typedef

struct

linknode;

//鏈式佇列的定義

typedef

struct

linkqueue;

//入隊操作//

void

enqueue

(linkqueue &q , elemtype x)

//出隊:出隊指的是頭結點的後繼結點出隊//

bool

dequeue

(linkqueue &q , elemtype &x)

4.雙端佇列

前開,後開,兩邊都開。

1.棧的應用

括號匹配

#include

#include

using

namespace std;

bool

check

(string str)

case

')':

else

return

false;}

case

']':

else

return

false;}

}}if(s.

empty()

==true

)else

}int

main()

字尾表示式(稍後補上)

遞迴

階乘運算

#include

using

namespace std;

intf

(int a)

intmain()

斐波那契

#include

using

namespace std;

intfib

(int a)

intmain()

2.佇列應

資料結構 棧與佇列

題目 1.編寫函式,採用鏈式儲存實現棧的初始化 入棧 出棧操作 2.編寫函式,採用順序儲存實現棧的初始化 入棧 出棧操作 3.編寫函式,採用鏈式儲存實現佇列的初始化 入隊 出隊操作 4.編寫函式,採用順序儲存實現佇列的初始化 入隊 出隊操作 5.編寫乙個主函式,在主函式中設計乙個簡單的選單,分別除錯...

資料結構 棧與佇列

棧的原則是後進先出,即插入與刪除元素均在棧頂進行。獲取棧頂元素 s.top 佇列的原則是先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行。獲取隊頭元素 q.front 思路 用兩個棧,乙個棧用來進隊,乙個棧用來出隊,當資料進入佇列的時候,我們將其壓入乙個棧,當資料出隊的時候,我們將儲存在棧內的資料...

資料結構 棧與佇列

1.棧的定義 2.用棧實現鍊錶 public class stacklinked public void setdata int data public node getnext public void setnext node next private int data private node ...