數據結構 學習筆記 棧和隊列

首先明確,棧和隊列 是特殊的線性表。

 

棧(STL : STACK)

一、定義

棧是只能在一端進行插入和刪除操作的線性表

日常例子:

洗碗摞一堆; 書摞成一堆; 一些槍支子彈夾中子彈的操作方式等。

1.1一些基本概念

棧頂(top)  進行插入和刪除操作的一端

棧底(bottom) 相對棧頂的另一端

入棧(push) 插入操作

出棧(pop) 出棧操作

空棧:無元素的棧

1.2棧的特性

後進先出 ( LIFO-- Last In  First Out ),或 先進後出 ( FILO-- First In  Last Out )

 

二、順序棧

2.1基本運算函數

#define MAXLEN 105
typedef struct {            //結構體定義順序棧
    int data[MAXLEN];
    int top;
}seqStack;
void initStack(seqStack *S) {        //初始化棧,將棧頂置於-1,這樣開始時從0插入
    S->top = -1;
}
bool stackEmpty(seqStack &S){        //判斷棧是否爲空
    if(S.top == -1) return true;
    else return  false;

    //return(S->top==-1);
}
bool stackFull(seqStack *S) {        //判斷棧是否爲滿
    if(S->top == MAXLEN - 1) return true;
    else return false;
}
void stackTop(seqStack *S, int *x) { //X取爲棧頂元素
    if(S->top == -1) {cout << "EMPTY ERROR" <<endl;return;}
    else *x = S->data[S->top];
}
void push(seqStack *S, int x) {       //插入
    if(S->top == MAXLEN - 1) {
        cout <<"ERROR"<<endl;
        return;
    }else {
        S->top++;
        S->data[S->top] = x;
    }
}
void pop(seqStack *S,int &x) {   //彈棧同時取到彈出元素
    if(stackEmpty(*S)) {cout <<"ERROR" <<endl; return;}
    else {
        x = S->data[S->top--];
    }
}

 

2.2 順序棧的特點

所有運算的時間複雜度均爲O(1); 通常一次性申請空間,只能按最大空間需求分配,容易造成空間浪費。-- 使用鏈式棧。

 

三、鏈棧

 

 

(以下運算爲不帶頭結點的運算)

typedef struct {
    int data[MAXLEN];
    int top;
}seqStack;
typedef struct listNode{
    int data;
    struct listNode *next;
}node;
void initStack_1(node *&top) {
    top = NULL;
}
bool stackEmpty_1(node *top) {
    return (top == NULL);
}
bool stackTop(node *top, int x) { //由於頭插法top僅跟着棧頂
    if(!top) return false;
    else {
        x = top -> data;
        return true;
    }
}
void push_1(node *& top, int x) { //頭插
    node *s;
    s = new node;
    s->data = x;
    s->next = top;
    top = s;
}
bool pop_1(node *& top, int &x) {
    node *u;
    if(!top) return false;
    else {
        x = top->data;          //取彈出元素
        u = top;                //臨時指針指到top
        top = top->next;        //top 後移
        delete(u);              //刪除結點
        return true;
    }
}
void DeleteStack(node *&top) {
    node *p, *u;
    p = top;
    while(p) {
        u = p;
        p = p->next;
        delete(u);
    }
    top = NULL;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章