3.數據結構筆記學習--棧和隊列
阿新 • • 發佈:2018-08-04
nbsp 初始化 判斷 頭插法 truct 聲明 oid color pty
- 棧的基本概念:
- 棧的定義:一種只能在一端進行插入或者刪除的線性表,這一端稱為棧頂
- 棧的特點:先進後出
- 棧的存儲結構:順序棧和鏈式棧
- 隊列的基本概念:
- 隊列的定義:允許在表的一端(隊尾)進行插入,在另一端(隊頭)進行刪除的線性表
- 隊列的特點:先進先出
- 隊列的存儲結構:順序隊和鏈隊
- 棧和隊列的存儲結構、算法:
- 順序棧的定義:
typedef struct { int data[maxSize]; //存放棧中的元素 int top; //棧頂指針 }SqStack;
- 鏈棧結點定義:
typedef struct LNode {
- 順序隊列定義:
typedef struct { int data[maxSize]; int front;//隊首指針 int rear; //隊尾指針 }SqQueue;
- 鏈隊定義:
- 隊結點類型定義:
typedef struct QNode { int data; struct QNode *next; //指針域 }QNode;
- 鏈隊類型定義:
typedef struct { QNode *front; QNode
- 隊結點類型定義:
- 順序棧的定義:
- 順序棧的基本算法操作:
- 順序棧st的要素
- 兩個狀態:
- 棧空狀態:st.top==-1
- 棧滿狀態:st.top==maxSize-1;
- 兩個狀態:
- 順序棧st的要素
-
-
- 兩個操作:
- 元素x進棧操作 ++(st.top); st.data[st.top]=x;
- 元素x出棧操作 x=st.data[st.top]; --(st.top);
- 兩個操作:
-
-
-
- 非法狀態,上溢和下溢
-
-
- 初始化棧的算法:
void initStack(Sqstack &st) //初始化棧 { st.top = -1; //將棧頂設置為-1
- 判斷棧空的算法:
int isEmpty(Sqstack st) { if(st.top==-1) return 1; else return 0; }
- 進棧算法:
int Push(SqStack &st, int x) { if(st.top == maxSize-1) return 0; ++(st.top); //先移動指針再進棧 st.data[st.top]=x; return 1; }
- 出棧算法:
int Pop(SqStack &st, int &x) { if(st.top == -1) return 0; x = st.data[st.top]; //先取出元素,再進行指針的移動 --(st.top); return 1; }
- 初始化棧的算法:
-
- 考題中實用的棧操作寫法:
- 聲明一個棧並且初始化: int stack[maxSize]; int top=-1; //聲明加初始化都有了
- 元素x進棧: stack[++top]=x;
- 元素x出棧: x=stack[top--];
- //++top 與top++的區別 :a=++top 是 top 先自增1,再將top值給a; 而b=top++ 是top先給b,再進行top自增1
- 考題中實用的棧操作寫法:
- 鏈棧的基本算法操作:
- 鏈棧的要素:
- 狀態:
- 棧空狀態:1st ->next = null;
- 兩個操作:
- 元素進棧:
p->next = 1st->next; 1st->next = p; //頭插法建立鏈表的插入操作
- 出棧操作:
p = 1st->next; x = p->data; 1st->next = p->next; free(p); //單鏈表刪除操作
- 元素進棧:
- 狀態:
- 鏈棧的初始化算法:
void InitStack(LNode *&1st) { 1st = (LNode*) malloc(sizeof(LNode)); //制造一個頭結點 1st->next = NULL; }
- 判斷棧空的算法:
int isEmpty(LNode *1st) { if(1st->next = NULL) return 1; else return 0; }
- 進棧算法:
void push(LNode *1st,int x) { LNode *p; p = (LNode*)malloc(sizeof(LNode)); p->next = NULL; P->data = x; p->next = 1st->next; 1st->next = p; }
- 出棧算法:
void Pop(LNode *1st,int &x) { LNode *p; if(1st->next==NULL) return 0; //單鏈表刪除操作 p = 1st->next; x = p->data; 1st->next = p->next; free(p); return 1; }
- 鏈棧的要素:
3.數據結構筆記學習--棧和隊列