資料結構C語言 Part3 棧與佇列
咕咕咕了很久的資料結構,趁著複習趕緊撿一下。
今天我們研究一下棧和佇列:
棧是一種特殊的線性表,刪除和插入操作受限,遵循後進先出First in last out的原則(就像網球筒一樣,先進後出)。習慣上,我們稱表頭端(先進的部分)為棧底bottom or base,表尾端為棧頂top,插入和刪除都在棧頂top進行。在棧頂插入元素我們叫做push,在棧頂刪去元素我們叫做pop。作為線性表,當然棧也分為順序棧和鏈棧。我們還是分開進行說明。
我們先來康康順序棧的表示和實現:
//建立一個初始化的棧,我們先從順序棧開始 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; //Initialize Status InitStack(SqStack &S) { S.base=new SElemType[MAXSIZE]; if(!S.base) exit(OVERFLOW); //分配失敗就溢位,退出程式; S.top=S.base; S.stacksize=MAXSIZE; return OK; } //Push Status Push(SqStack &S,SElemType e) { if(S.top - S.base ==S.stacksize) return ERROR; //棧滿了 *S.top=e; //強調一下,top指標邏輯上永遠懸空在棧頂元素上方一個空位置 S.top++; //所以我們先賦值,再讓S.top++ return OK; } //Pop Status Pop(SqStack &S,SElemType &e) //刪除棧頂元素,用e返回其值 { if(S.top==S.base) return ERROR;//Empty stack S.top--; //棧頂指標- - e=*(S.top); //取出目前最高的棧頂元素的值 return OK; } //取棧頂元素 SElemType GetTop(SqStack S) //訪問S,但是不修改S,所以我們直接用SqStack S就可以了 { if(S.top != S.base) //棧非空,只有在空棧的時候,才是top指標 == base指標 return *(S.top--); }
我們再看看鏈棧:
//Statement typedef struct stacknode { elemtype data; struct stacknode *next; }stacknode,*Linkstack; //Initialize Status initstack(Linkstack &S) //There's no need to set a head node to create an empty stack,棧頂指標置空就可以 { S=NULL; return OK; } Status push(Linkstack &S,elemtype e) { p=new stacknode; p->data=e; p->next=S; S=p; return OK; } Status pop(Linkstack &S,elemtype &e) { //刪除棧頂元素,用e返回其值 if(S==NULL) return ERROR; e=S->data; p=S; S=S->next; delete p; return OK; }
把棧理解為一個網球筒,入棧的元素就是放入一個新球p,data域為其值,next域指向棧頂S,然後再把棧頂S賦值為新的p,是一個從上而下的結構,後進先出,先進後出。
情景示例:
設想若干年後,幼兒園裡,老師正在給某個父母都是程式設計師的小男孩聽寫大小寫的alphabet,老師唸了:“大寫的A 小寫的k 大寫的M 大寫的N...”共十幾個字母,小朋友需要在聽寫結束的時候,把老師聽寫的字母按順序倒著念出來,由於小朋友感冒了,不想說話,於是想寫程式碼把這些字母一一呈現在螢幕上。意思意思而已。
#include "stdafx.h" #include <stdio.h> #define MAXSIZE 100 //為了傳承嚴蔚敏教材的風格,我們還是設定一個Status返回值 typedef int Status; #define OK 1 #define ERROR 0 #define OVERFLOW -2 //基本資料結構棧的定義 typedef struct { char *base; char *top; int stacksize; //記錄棧的容量 }SqStack; //順序棧的初始化 Status InitStack(SqStack &S) { S.base = new char[MAXSIZE]; //哼哼,反正現在記憶體也不值錢 if (!S.base) return ERROR; //儲存分配失敗 S.top = S.base; //最開始的時候,top和base指向同一個單元 S.stacksize = MAXSIZE; //作為判滿的標誌 return OK; } //入棧push ,把新元素e插入作為棧頂元素 Status Push(SqStack &S, char &e) //這是引用的方式,這個在我前面的水文中有提到過。 { if (S.top - S.base == S.stacksize) return ERROR;//棧滿了,爆棧工程師瞭解一下?指標作差是返回相應的單元的個數 *S.top = e; //注意top指標永遠是在實際棧頂 上方元素 的下標地址 S.top++; //如果你比較炫技,可以寫成*S.top++ =e; return OK; } //出棧,雖然在這個情境下用不到的 Status Pop(SqStack &S, char &e) { if (S.top == S.base) return ERROR; //棧空了,甚至沒有元素可以出棧 e = *--S.top; //炫技瞭解一下? return OK; } //取出棧頂元素,印出老師聽寫的最後一個字母 char GetTop(SqStack &S) { if (S.top != S.base);//非空 return *(S.top - 1); //重中之重,一定要區分,是否你的這行程式碼修改了棧頂指標,此時top指標並未修改 } #include <stdio.h> int main(void) { SqStack S; InitStack(S); char Tingxie; scanf("%c", &Tingxie); Push(S,Tingxie); printf("%c\n",GetTop(S)); }
然後我們再看看佇列:
佇列是一種特殊的線性表,限定插入和刪除操作分別在表的兩端進行。具有先進先出(FIFO—First In First Out)的特點。我們可以把這個佇列理解成排隊買地鐵票。
廢話不多說,直接上程式碼。
#define MAXSIZE 1000
typedef struct
{
elemtype *base; //儲存空間的基地址
int front;
int rear;
}SqQuene;
//Initialize
Status InitQueue(SqQueue &Q)
{
Q.base=new elemtype[MAXSIZE];
if(!Q.base) return OVERFLOW;
Q.front=Q.rear=0;
return OK;
}
//attain the length of Q
int Qlength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;//take care of cyclic queue
}
//In queue
Status EnQueue(SqQueue &Q,elemtype e)
{
if((Q.rear+1)%MAXSIZE=Q.front) return ERROR;
Q.base[Q.rear]=e;//新元素插入隊尾
Q.rear=(Q.rear+1)%MAXSIZE;//存進去,再加一,rear初始時為空
return OK;
}
//out q
Status DeQueue(SqQueue &Q,elemtype &e)
{
if(Q.front=Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
相關推薦
資料結構C語言 Part3 棧與佇列
咕咕咕了很久的資料結構,趁著複習趕緊撿一下。 今天我們研究一下棧和佇列: 棧是一種特殊的線性表,刪除和插入操作受限,遵循後進先出First in last out的原則(就像網球筒一樣,先進後出)。習慣上,我們稱表頭端(先進的部分)為棧底bottom or base,表尾
資料結構-線性表(棧與佇列基本概念)
棧(stack,zhan):是限定僅在表尾進行插入和刪除操作的線性表。 把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出(Last In First Out)的線性表,簡稱LIFO結構。 棧是一個線性表,棧元素
資料結構理論基礎-3—棧與佇列
棧 棧(stack):是限定僅在表尾進行插入和刪除操作的線性表。(注意,表尾是棧頂,不是棧底) 允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),棧又稱為後進先出(Last In First Out),簡稱LIFO結構
嚴蔚敏資料結構C語言實現棧的基本操作
int main(){ SqStack S; SElemType *e; int n,i; InitStack(&S); printf("請輸入需要入棧的資料個數\n"); scanf("%d",&n); for(i=0;i<n;i++) { sca
資料結構C語言描述———用順序佇列判斷迴文數
所謂迴文數就是正著讀跟倒著讀一樣,比如abcba。用佇列判斷迴文數需要一個棧作為中間量,把一串數字分別進棧和入隊,按照棧先進後出和佇列先進先出的原則,如果棧頂元素跟隊頭元素相等,則棧頂元素出棧同時隊頭元素出隊,接著往下比較,知道必到該串數字的長度的一半,如果之前出棧的元素和
資料結構(C語言版 嚴蔚敏著)——棧和佇列
棧的定義: · 書本定義:棧是一個後進先出的線性表,它只要求只在表尾 進行刪除和插入操作。 · 通俗定義:棧就是一個特殊的線性表(順序表,連結串列),操作上有一些特殊性: -棧的元素必須“後進先出”。 -棧的操作只能在這個線性表的表尾進行。
資料結構——C語言的迴圈佇列
C語言版迴圈佇列 #ifndef QUEUE #define QUEUE #define maxsize 4 typedef struct { int data[maxsize]; int front; int rear; }*Queue, Node; #endif #in
迴圈佇列的應用——舞伴配對問題(資料結構 C語言)
迴圈佇列的應用——舞伴配對問題: 在舞會上,男、女各自排成一隊。舞會開始時,依次從男隊和女隊的隊頭各出一人配成舞伴。如果兩隊初始人數不等,則較長的那一隊中未配對者等待下一輪舞曲。假設初始男、女人數及性別已經固定,舞會的輪數從鍵盤輸入。試模擬解決上述舞伴
資料結構-C語言實現線性棧
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//儲存空間初始化分配量 #define STACKINCREAMENT 10//儲存空間分配增量 #defi
資料結構-C語言實現迴圈佇列
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define OK 1 #define OVERFLOW -1 typedef struct{ int *base;
資料結構 c語言實現順序佇列(輸數字入隊,字元出隊)
一.標頭檔案seqqueue.h實現 #ifndef __SEQQUEUE_H__ #define __SEQQUEUE_H__ #include<stdio.h> #include<stdlib.h> #include<stdbool.h&g
順序棧的九種基本操作和實現(資料結構C語言版清華大學嚴蔚敏)
棧是僅限定在表尾進行插入和刪除操作的線性表,在嚴蔚敏版的C語言版的資料結構中共定義了九種棧的基本操作;分別是構造 銷燬 清空 棧長 棧頂 插入 刪除 遍歷。下面就是程式碼實現: 標頭檔案和巨集定義(
0x00資料結構——C語言實現(棧+字尾表示式計算)
0x00資料結構——C語言實現(棧) 棧的實現 /* 棧(tack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。 對棧的基本操作有Push(進棧)和Pop(出棧)。 Functions: (在連結串列中增加
資料結構——c語言描述 第三章 (2)棧的練習(四則運算的實現)
棧的基本概念和實現我在上一篇文章中實現了,現在做一下練習,一個簡單的四則運算的實現,還是比較簡單的,我並沒有再往下實現括號的四則運算,這個都是次要的,主要是掌握棧的操作方法,和一些基本的注意事項,其實這個程式碼我之前刪除了又重寫了一邊,第一遍在實現的過程中對自己的程式碼並沒
嚴蔚敏 資料結構C語言 銀行排隊佇列 離散事件模擬
系統每次隨機生成的是1)當前顧客顧客的櫃檯被服務時間2)當前顧客和下一個顧客到達的間隔時間,記住這2點就理解了整個程式碼,書裡說得不太清楚。每個顧客在銀行的等待時間取決於佇列裡前一個節點的離開時間,而不是自己的到達時間+服務時間。 程式碼設定了EventList這個事件連
資料結構C語言實現之鏈式佇列的6種演算法程式碼
#include <stdio.h>#include <stdlib.h>typedef int elemType;/************************************************************************//* 以下是關於佇列連
[資料結構]c語言實現鏈棧的入棧,出棧,清空,銷燬等操作
最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化
演算法與資料結構(3):基本資料結構——連結串列,棧,佇列,有根樹
原本今天是想要介紹堆排序的。雖然堆排序需要用到樹,但基本上也就只需要用一用樹的概念,而且還只需要完全二叉樹,實際的實現也是用陣列的,所以原本想先把主要的排序演算法講完,只簡單的說一下樹的概念。但在寫的過程中才發現,雖然是隻用了一下樹的概念,但要是樹的概念沒講明白的話,其實不太好理解。所以決定先介紹一下基本的資
資料結構JAVA版之棧和佇列
一、涉及的內容大綱 二、簡單介紹棧、佇列和其他資料結構的不同 1 對於其他的資料結構而言,都適用與資料庫應用中作資料記錄。但是因為棧和佇列的生命週期比那些資料庫型別的資料結構要短,所以他們只是在程式的操作期間才會建立和執行,在完成任務之後就會被銷燬。所以棧和佇列更多的是用於構思演算法的
玩轉資料結構——第二章:棧和佇列
內容概覽: 棧和棧的應用:撤銷操作和系統棧 棧的基本實現 棧的另外一個應用:括號匹配 關於Leetcode的更多說明 陣列佇列 迴圈佇列 迴圈佇列的實現 陣列佇列和迴圈佇列的比較 2-1.棧(Stack) 棧也是一種線性結構