承接上次狀態不佳整理的有關棧佇列的總結https://www.cnblogs.com/gaodiyuanjin/p/18424324
作補充 關於演算法的實現 主要就是棧和佇列的順序儲存和鏈式儲存
順序棧
初始化棧頂指標:
S.top=-1; //S.top=0
//入棧
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1) //棧滿
return false;
S.data[++S.top]=x; //S.data[S.top++]=x;
return true;
}
//出棧
bool Pop(SqStack &S,ElemType x){
if(S.top==-1) //棧空
return false;
x=S.data[S.top--]; //x=S.data[--S.top];
return true;
}
鏈棧
不帶頭結點的鏈棧
// 入棧操作
bool Push(Stack *S, ElemType x) {
Node *p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = S->top;
S->top = p;
return true;
}
// 出棧操作
bool Pop(Stack *S, ElemType x) {
if (S->top == NULL) { //棧空
return false;
}
Node *p = S->top;
x = p->data;
S->top = p->next;
free(p);
return true;
}
帶頭結點的鏈棧
// 入棧操作
bool Push(Stack *S, ElemType x) {
Node *p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = S->header->next;
S->header->next = p;
return true;
}
// 出棧操作
bool Pop(Stack *S, ElemType x) {
if (S->header->next == NULL) { //棧空
return false;
}
Node *p = S->header->next;
x = p->data;
S->header->next = p->next;
free(p);
return true;
}
佇列的順序儲存
// 入隊操作
bool Enqueue(SeqQueue *Q, ElemType x) {
if ((Q->rear + 1) % MaxSize == Q->front) { //隊滿
return false;
}
Q->data[Q->rear] = x;
Q->rear = (Q->rear + 1) % MaxSize;
return true;
}
// 出隊操作
bool Dequeue(SeqQueue *Q, ElemType x) {
if (Q->front == Q->rear) { //隊空
return false;
}
x = Q->data[Q->front];
Q->front = (Q->front + 1) % MaxSize
return true;
}
迴圈佇列的順序儲存
初始化:
Q.rear=Q.front=0;
//入隊
bool EnQueue(SqQueue &Q,ElemType x){
if((Q.rear+1)%MaxSize==Q.front) //隊滿
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
return true;
}
//出隊
bool DeQueue(SqQueue &Q,ElemType &x){
if(Q.rear==Q.front) //隊空
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
佇列的鏈式儲存
帶頭結點
初始化:
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
//入隊
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
//出隊
bool DeQueue(LinkQueue &Q,ElemType x){
if(Q.front==Q.rear) //空隊
return false;
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p) //佇列只有一個結點 刪除後變為空
Q.rear=Q.front;
free(p);
return true;
}
不帶頭結點
初始化:
Q.front = NULL;
Q.rear = NULL;
//入隊
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
if(Q.rear == NULL){ //隊空
Q.front = s;
Q.rear = s;
}else{
Q.rear->next=s;
Q.rear=s;
}
}
//出隊
bool DeQueue(LinkQueue &Q,ElemType x){
if(Q.front==NULL) //空隊
return false;
LinkNode *p=Q.front;
x=p->data;
Q.front=p->next;
if(Q.front==NULL) //佇列變為空
Q.rear=NULL;
free(p);
return true;
}