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 ...