2019資料結構考研(三)------棧和佇列
阿新 • • 發佈:2019-01-07
棧和佇列
知識架構
棧
棧的基本概念
棧的定義:棧是一種只允許在一端進行插入或者刪除的線性表(後進先出的線性表)
棧頂:棧中允許插入和刪除的一端
棧底:固定的
空棧
棧的順序儲存結構
棧的順序表示
#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;
}