1. 程式人生 > >資料結構C語言 Part3 棧與佇列

資料結構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) 棧也是一種線性結構