1. 程式人生 > >2019資料結構考研(三)------棧和佇列

2019資料結構考研(三)------棧和佇列

棧和佇列

知識架構

知識框架

棧的基本概念

棧的定義:棧是一種只允許在一端進行插入或者刪除的線性表(後進先出的線性表)
棧頂:棧中允許插入和刪除的一端
棧底:固定的
空棧

棧的順序儲存結構

棧的順序表示

#define MaxSize 50
typedef struct {
    ElemType data[MaxSize];
    int top;//棧頂指標 
}SqStack;

順序棧基本操作的實現

  • 棧的初始化
void InitStack(SqStack &S){
    S.top=-1;//初始化棧頂元素  
}
  • 判斷棧空
bool StackEmpty(SqStack s){
    if(s.top==-1)
    return true;//棧為空,返回true 
    else
    return false;
} 
  • 入棧操作
bool Push(SqStack &s,ElemType x){
    if(s.top==MaxSize-1)//判斷棧滿
    return false;
    else
    s.data[++s.top]=x;//棧頂指標先加一,再入棧 
    return true; 
} 
  • 出棧操作
bool Pop(SqStack &s,ElemType x){
    if
(s.top==-1)//判斷棧空 return false; else x=s.data[s.top--];//先出棧,指標減一 return true; }
  • 讀棧頂元素
bool GetTop(SqStack s,Elemtype x){
    if(s.top==-1)
    return false;//棧空,報錯
    else
    x=s.data[top];//x記錄棧頂元素 
    return true; 
}

在棧頂指標指向棧頂元素時
在入棧的時候,指標先加一,然後資料入棧
在出棧的時候,資料先出棧,然後指標減一

棧的鏈式儲存結構

棧的鏈式儲存型別

typedef struct LinkNode{
    ElemType data;//資料域
    struct LinkNode* next;//指標域 
}*LiStack;

習題
這裡寫圖片描述
習題解析

佇列

佇列的基本概念

  • 佇列:佇列是指只在一端進行刪除在一端進行插入的受限操作的線性表
  • 隊頭:只允許刪除的一端,又稱為隊首
  • 隊尾:允許插入的一端

佇列的順序儲存結構

佇列的順序儲存型別可以描述為

typedef struct{
    ElemType data[MaxSize];
    int front,rear;//隊尾和隊首指標 
}SqQuence;

為了解決假溢位的問題,提出來迴圈佇列的概念

迴圈佇列的基本操作

  • 佇列初始化
void InitQuence(SqQuence &q){
    q.rear=q.front=0;//初始化隊首和隊尾指標 
} 
  • 判空
bool isEmpty(SqQuence q){
    if(q.rear==q.front)//佇列為空的條件 
    return true;
    else
    return false;
}
  • 入隊
bool enQuence(SqQuence &q,ElemType x){
    if((q.rear+1)%MaxSize==q.front)//隊滿 
    return false;
    q.data[rear]=x;
    rear=(rear+1)%MaxSize; //隊尾指標加一取模 
    return true;
} 
  • 出隊
bool DeQuence(SqQuence &q,ElemType x){
    if(q.rear==q.front)//隊空 
    return false;
    x=q.data[front];
    front=(front+1)%MaxSize; //隊首指標加一取模 
    return true;
}

佇列的鏈式儲存結構

佇列的鏈式表示稱為鏈佇列:是指同時帶有隊首指標和隊尾指標的單鏈表.頭指標指向隊頭結點,尾指標指向隊尾結點

鏈佇列的基本操作

  • 初始化鏈佇列
void InitQuence(LinkNode &q){
    q.front=q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立頭結點
    q.front->next=null;//初始為空 
}
  • 判隊空
bool IsEmpty(LinkNode q){
    if(q.front==q.rear)
    return true;
    else 
    return false;
} 
  • 入隊
void EnQuence(LinkNode &q,ElemType x){
    s=(LinkNode*)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=null;
    q.rear->next=s;
    q.rear=s;
}
  • 出隊

 - 出隊
bool DeQuence(LinkQuence &q,ElemType x){
    if(q.front==q.rear)//隊空 
    return false;
    p=q.front->next;
    x=p->data;
    q.front->next=p->next;
    if(p==q.rear)//如果佇列裡面只有一個結點 
    q.rear=q.front;
    free(p);
    return true;
}