循序漸進學習棧和佇列
阿新 • • 發佈:2018-11-27
一、棧
1.棧的定義:
是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義稱為棧頂,相應地,表頭端稱為棧底。棧的修改是按後進先出的原則進行的,因此又稱後進先出表。
解釋:棧是一個很簡單的資料結構,但是好多人不能理解它的重要的特性,即只能在棧頂的位置進行操作,可以理解棧是一個水杯,只能在杯口倒水或者喝水。
2.棧的定義和特點:
1.定義:只能在表的一端(棧頂)進行插入和刪除運算的線性表
2.邏輯結構:與線性表相同,仍為一對一關係
3.儲存結構:用順序棧或鏈棧儲存均可,但以順序棧更常見(本文探討順序棧)
4.運算規則:只能在棧頂運算,且訪問結點時依照後進先出(LIFO)
5.實現方式:關鍵是編寫入棧和出棧函式,具體實現依順序棧或鏈棧的不同而不同。
3.順序棧的基本操作
1.初始化
typedef struct{
int data[maxsize];
int top;
}Sqstack; // 順序棧型別定義
void init(Sqstack &st){
st.top = -1;
}
2.判斷棧空
int isEmpty(Sqstack st){
if (st.top == -1)
return 1;
else
return 0;
}
3.進棧
int push(Sqstack &st ,int x){ // 棧滿,不能進棧 if (st.top == maxSize - 1) return 0; // 先移動指標,再進棧 ++ (st.top); st.data[st.top] = x; return 1; }
4.出棧
int pop (Sqstack &st, int &x){
// 空棧,不能出棧
if (st.top == -1)
return 0;
// 先取出元素,再移動指標
x = data[st.top];
-- st.top;
return 1;
}
三、佇列
1.佇列的定義:
是一種先進先出的線性表,它只允許在表的一端進行插入,而在另一端刪除元素,在佇列中,允許插入的一端稱做隊尾,允許刪除的一端稱做隊頭。
解釋:佇列是一個很簡單的資料結構,從隊尾插入,隊頭刪除,可以理解佇列是一個單行道,如圖可知。
2.佇列的定義和特點:
1.定義:只能在表的一端(隊尾)進行插入,在另一端(隊頭)進行刪除運算的線性表
2.邏輯結構:與線性表相同,仍為一對一關係
3.儲存結構:用順序佇列或鏈隊儲存均可
4.運算規則:先進先出(FIFO)
5.實現方式:關鍵是編寫入隊和出隊函式,具體實現依順序隊或鏈隊的不同而不同
3.佇列的基本操作
#define M 100 //最大佇列長度
Typedef struct {
QElemType *base; //初始化的動態分配儲存空間
int front; //頭指標
int rear; //尾指標
}SqQueue;
空隊標誌:front= =rear
入隊:base[rear++]=x;
出隊:x=base[front++];
4.迴圈佇列
介紹迴圈佇列之前首先來看看一種現象:
這種現象也是佇列的弊端,發生假溢位現象。如果解決-----迴圈佇列
如上圖可以知道,迴圈佇列的入隊和出隊的條件一樣。沒辦法區分。
解決方案:
1.另外設一個標誌以區別隊空、隊滿2.少用一個元素空間:隊空:front==rear;隊滿:(rear+1)%M==front
5.迴圈佇列的基本操作
#define MAXQSIZE 100 //最大長度
Typedef struct {
QElemType *base; //初始化的動態分配儲存空間
int front; //頭指標
int rear; //尾指標
}SqQueue;
1.迴圈佇列初始化:
Status InitQueue (SqQueue &Q){
Q.base =new QElemType[MAXQSIZE]
if(!Q.base) exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
2.求迴圈佇列長度:
int QueueLength (SqQueue Q){
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
3.迴圈佇列入隊:
Status EnQueue(SqQueue &Q,QElemType e){
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
4.迴圈隊列出隊:
Status DeQueue (LinkQueue &Q,QElemType &e){
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}