資料結構棧及其用法(C語言實現)

來源:互聯網
上載者:User

標籤:

一、棧的定義

棧是限定僅在表尾進行插入或刪除操作的線性表。一次對棧來說,表尾端有其特殊的含義,稱為棧頂,相應

的,表頭端成為棧底。不含元素的空表稱為空白棧。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
二、棧的特點

棧作為一種資料結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進後出的原則儲存資料

,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後一個資料被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指標。所以,我們又稱棧為後進先出,即 last in first out,簡稱LIFO結構。它的結構圖如下:


三、棧的基本操作

由於棧也是線性表,因此線性表的儲存結構對棧也適用,通常棧有順序棧和鏈棧兩種儲存結構,這兩種儲存結

構的不同,則使得實現棧的基本運算的演算法也有所不同。

順序棧,即棧的順序儲存結構是利用一組連續的儲存單元依次存放自棧底到棧頂的資料元素。在順序棧中有上

溢和下溢的概念。順序棧就想在一個盒子裡放書一樣,你要拿書只能從最上面拿,如果書本放到盒子中,超過合資的頂部,那麼便是上溢。反正如果沒有書了,我們還去拿書,那麼便是下溢。

而鏈棧沒有上溢的限制,它只需要在頭部進行操作,我們在要儲存大量資料元素的時候才會用到鏈棧,一般情

況都是用順序棧。因此下面我給出順序棧的例子:

#include<iostream>#include<cstdio>#include<malloc.h>using namespace std;const int stack_size = 100;const int stackcreament = 10;typedef struct sqstack{    int *base;      //棧底指標    int *top;       //棧頂指標    int stacksize;}sqstack;void initstack(sqstack *s)      //構造一個空棧{    (*s).base = (int *)malloc(sizeof(int) * stack_size);    if(!(*s).base)        exit(0);    (*s).top = (*s).base;    (*s).stacksize = stack_size;}void destory(sqstack &s)        //銷毀一個棧{    free(s.base);    s.base = NULL;    s.top = NULL;    s.stacksize = 0;}void clearstack(sqstack &s)     //清空一個棧{    s.top = s.base;}bool emptystack(sqstack &s)     //判斷一個棧是否為空白{    if(s.top == s.base)        return 1;    return 0;}int lengthstack(sqstack &s)     //返回這個棧的長度{    return s.top - s.base;}int gettop(sqstack &s)          //取棧頂元素{    if(s.base == s.top)        return 0;    return *(s.top-1);}int push(sqstack &s, int data)      //插入新的元素作為棧頂元素{    if(s.top - s.base >= s.stacksize) //棧滿,追加空間    {        s.base = (int *)realloc(s.base, (s.stacksize+stackcreament)*sizeof(int));        s.top = s.base + s.stacksize;        s.stacksize += stackcreament;    }    *(s.top) = data;    s.top++;}int pop(sqstack &s)             //刪除棧頂元素{    if(s.base == s.top)        return 0;    s.top--;}int main(){    sqstack s;    initstack(&s);    for(int i=0;i<10;i++)        push(s, i);    for(int i=0;i<10;i++)    {        int a = gettop(s);        printf("%d  ", a);        pop(s);    }    printf("\n");    if(emptystack(s) == 1)        printf("不為空白\n");    int len = lengthstack(s);    printf("%d\n", len);    destory(s);    return 0;}

棧的幾個典型應用的例子:數制的轉換, 括弧匹配的檢查, 行編輯程式等等, 都是利用棧的先進後出特徵來進行求解的。

資料結構棧及其用法(C語言實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.