【數據結構】第三章 棧和隊列

1 棧的概念

  • 棧:限定僅在表尾進行插入和刪除操做的線性表,後進先出的線性表,簡稱LIFO結構
  • 棧頂:表尾,容許插入和刪除的一端
  • 棧底:表頭,不容許插入和刪除的一端
  • 空棧:不含任何數據元素的棧

2 棧的順序存儲結構

(1) 結構代碼

typedef int SElemType
typedef struct
{
    SElemType data[MAXSIZE];
    int top;
}SqStack;

(2) 屬性

clipboard.png

(3) 操做

A 插入push:進棧

Status Push(SqStack *S,SElemType e)
{
    if(S->top==MAXSIZE-1){ //棧滿    
        return ERROR;
    }
    S->top++; //棧頂指針增長
    S->data[S->top]=e; //將新插入元素賦值給棧頂空間
    return OK;
}

B 刪除pop:出棧

Status Pop(SqStack *S,SElemType *e)
{
    if(S->top==-1){
        return ERROR;
    }
    *e=S->data[S->top]; //將要刪除的棧頂元素賦值給e
    S->top--; //棧頂指針減一
    return OK;
}

C 進棧出棧有多種狀況,只要保證是棧頂元素出棧就能夠。

3 兩棧共享空間

(1) 定義

clipboard.png

一個棧增長,一個棧縮短,當top1+top2==top2時棧滿。數組

(2) 結構代碼

typedef struck
{
    SElemType data[MAXSIZE];
    int top1;
    int top2;
}SqDoubleStack;

(3) 操做

A 插入push:進棧

Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
    if(S->top1+1==S->top2){ //棧已滿,不能再push新元素了
        return ERROR;
    }
    if(stackNumber==1){ //棧 1 有元素進棧
        S->data[++S->top1]=e; //如果棧1則先top1+1後給數組元素賦值
    }
    else if(stackNumber==2){ //棧2有元素進棧
        S->data[--S->top2]=e; //如果棧2則先top2-1後給數組元素賦值
    }
    return OK;
}

B 刪除pop:出棧

Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{
    if(stackNumber==1){
        if(S->top1==-1){
            return ERROR; //說明棧1已是空棧,溢出
        }
        *e=S->data[S->top1--]; //將棧1的棧頂元素出棧 
    }
    else if(stackNumber==2){
        if(S->top2==MAXSIZE){
            return ERROR; //說明棧2已是空棧,溢出
        }
        *e=S->data[S->top2++]; //將棧 2 的棧頂元素出棧 
    }
    return OK;
}

4 棧的鏈式存儲結構

(1) 結構代碼

typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
    LinkStackPtr top;
    int count;
}LinkStack;

(2) 操做

A 插入push:進棧

Status Push(LinkStack *S,SElemType e)
{
    LinkStackPtr p=(LinkStackPtr)malloc(sizeof(StackNode));
    p->data=e;
    p->next=S->top; //把當前的棧頂元素賦值給新結點的直接後繼
    S->top=p; //將新的結點s賦值給棧頂指針
    S->count++;
    return OK;
}

B 刪除pop:出棧

Status Pop(LinkStack *S,SElemType *e)
{
    LinkStackPtr p;
    if(StackEmpty(*S)){
        return ERROR;
    } 
    *e=S->top->data;
    p=S->top; //將棧頂結點賦值給p
    S->top=S->top->next; //使得棧頂指針下移一位,指向後一結點
    free(p); //釋放結點p
    S->count--;
    return OK;
}
相關文章
相關標籤/搜索