1. 程式人生 > >循序漸進學習棧和佇列

循序漸進學習棧和佇列

一、棧

1.棧的定義:

是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有其特殊含義稱為棧頂,相應地,表頭端稱為棧底。棧的修改是按後進先出的原則進行的,因此又稱後進先出表。

解釋:棧是一個很簡單的資料結構,但是好多人不能理解它的重要的特性,即只能在棧頂的位置進行操作,可以理解棧是一個水杯,只能在杯口倒水或者喝水。

2.棧的定義和特點:

1.定義:只能在表的一端(棧頂)進行插入和刪除運算的線性表

2.邏輯結構:與線性表相同,仍為一對一關係

3.儲存結構:用順序棧或鏈棧儲存均可,但以順序棧更常見(本文探討順序棧)

4.運算規則:只能在棧頂運算,且訪問結點時依照後進先出(LIFO)

先進後出(FILO)的原則

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;
}