1. 程式人生 > 其它 >2021/09/28

2021/09/28

今天把資料結構中的棧和佇列整理了一下,程式碼和書上有一點不一樣,但都是下午自己打的也驗證過的,也算有自己的理解了吧。等會把大物寫了,再複習會離散,就這樣吧。。


順序棧:
#define MAXSIZE 100
typedef struct
{
SElemType *base;//尾指標
SElemType *top;//頭指標
int stacksize;
}Stack;

進棧:先壓後加,是top指標一直指向最後資料的後一位
出棧:先減後出

void InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];//開闢空間
S.top = S.base ;
S.stacksize = MAXSIZE;


}

void Push(Stack &S)
{
if(S.top-S.base==S.stacksize) return ;//先判斷是否棧滿
cin>>*S.top;
S.top++;
}

void Pop(Stack &S)
{
if(S.top==S.base) reuturn ;//判斷棧空
S.top--;
cout<<*S.top;
}

***********************************************************
-----------------------------------------------------------


***********************************************************
鏈棧:無頭節點,直接將頭指標一端作棧頂

typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode,*LinkStack;

void InitStack(LinkStack &S)
{
S=NULL;//直接將頭指標指向NULL,如果S->next=NULL,則當前S為頭節點,則不為空
}

void Push(LinkStack &S)//頭插法插入
{
LinkStack p = new StackNode;


cin>>p->data;
p->next=S;
S = p;
}

void Pop(LinkStack &S)//出棧
{
while(S)//當S=NULL時,把鏈棧中所有資料輸出
{
cout<<S->data;
LinkStack p =S;
S=S->next;
delete p;
}

if(S==NULL) return ;//將當前頭指標指向的資料輸出
cout<<S.data;
LinkStack p = S;
S=S->next;
delete p;
}

***********************************************************
-----------------------------------------------------------
***********************************************************
佇列
順序佇列
#define MAXSIZE 100
typedef struct
{
QElemType *base;
int front;//頭指標
int rear;//尾指標
}SqQueue;

//隊空:Q.front==Q.rear;
//隊滿:(Q.rear+1)%MAXSIZE==Q.front;
少用了一個元素空間,否則當隊空和隊滿時都滿足Q.front==Q.rear;

void InitQueue(SqQueue &Q)
{
Q.base = new QElemType[MAXSIZE];
Q.front = Q.base = 0;//將頭尾指標置0,佇列為空
}

int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;//防止當是迴圈佇列時,返回負數
}

void EnQueue(SqQueue &Q)//用尾插,先進先出,先壓後加
{
if((Q.rear + 1)%MAXSIZE==Q.front) return ;//判斷是否隊滿
cin>>Q.base[Q.rear];
Q.rear = (Q.rear+ 1)%MAXSIZE;
}

void DeQueue(SqQueue &Q)//先出後加
{
if(Q.front ==Q.rear) return ;
cout<<Q.base[Q.front];
Q.front = (Q.front + 1)%MAXSIZE;
}

***********************************************************
-----------------------------------------------------------
***********************************************************
鏈隊:有頭節點
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//隊頭指標
QueuePtr rear;//隊尾指標
}LinkQueue;
將兩個佇列指標合併,傳參時只需定義一個LinkQueue物件,就可以呼叫佇列指標

void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;//將兩指標同時指向頭節點
Q.front->next=NULL;
}

void EnQueue(LinkQueue &Q)//尾插
{
QueuePtr p = new QNode;
cin>>p->data;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}

void DeQueue(LinkQueue &Q)
{
/*
*輸出一個
*/
if(Q.front==Q.rear) return ;//判斷棧是否空
QueuePtr p = Q.front->next;
cout<<p->data;
Q.front->next = p->next;
if(Q.rear==p) Q.rear = Q.front;//當最後一個元素被刪時,尾指標指向頭指標
delete p;


/*
*全部輸出
*/
QueuePtr p;
while(Q.front!=Q.rear)
{
p = Q.front->next;
cout<<p->data;
Q.front->next=p->next;
if(p==Q.rear) break;
else delete p;
}
Q.rear=Q.front;//將尾指標指向頭
delete p;//此時佇列中只有頭節點
}