資料結構學習之棧

來源:互聯網
上載者:User

註:本文的主要目的是為了記錄自己的學習過程,也方便與大家做交流。轉載請註明來自:

http://blog.csdn.net/ab198604

        一般來說,在進行程式設計時需要考慮資料的儲存方式,不同的資料存放區方式決定了其相應的資料檢索方法。通常檢索資料常用的儲存結構為棧和隊列。下面先簡單介紹下這“棧”這種儲存結構的一些基本知識。

        一、棧

        棧是一種按照先進後出的資料存放區結構(LIFO),它檢索元素的順序與儲存元素的順序是相反的。所謂的先進後出是指資料元素的儲存與刪除操作,這意味著最後一個儲存的元素將會第一個被刪除。舉個例子,現在要把"5,4,3,2,1"存入到“棧”中,從棧的底部到頂部分別是5,4,3,2,1,當刪除時,順序為“1,2,3,4,5”。

        不說理論了,來點乾貨。如何?“棧”這種資料結構呢?其實,實現棧的方法有很多,可以用順序的線性儲存結構和鏈式的非線性儲存結構。順序儲存結構如數組的方式。鏈式儲存結構,顧名思義,是採用鏈表的儲存方式。採用鏈表的方式來實現棧不僅操作簡單,而且可以使棧具有多態的特性。這是因為除了棧本身的一些操作外,它畢竟本身就是一種鏈表,它具有與鏈表的相同屬性。因此還可以使用鏈表的一些操作。所以本文採用鏈表的方式來實現棧。

        二、棧的結構及介面定義

        由於棧是鏈表的另一種表現形式,所以對棧的結構定義可以在鏈表的基礎上進行一次封裝。如下所示:

/*  * filename: stack.h * author:zhm * date:2012-01-05 */#ifndef STACK_H#define STACK_H#include <stdlib.h>#include "list.h"typedef List Stack;//對List類型重新定義

對鏈表的結構定義及介面,在《資料結構學習之單向鏈表結構》已經說明,這裡不再講述,有需要的朋友可以登入這個地址訪問相關的內容:

http://blog.csdn.net/ab198604/article/details/8253405

由上面的typedef List Stack語句就已經實現了棧結構的定義了。下面為棧的相關操作:

/* public interface */#define stack_init list_init#define stack_destroy list_destroyint stack_push(Stack *stack, const void *data);int stack_pop(Stack *stack, void **data);#define stack_peek(stack) ((stack)->head == NULL ? NULL : (stack)->head->data)#define stack_size list_size

        主要有棧的初始化,棧的銷毀,壓棧操作,入棧操作等。棧的初始化、銷毀及棧元素大小擷取等都是在原鏈表介面的基礎上用#define語句進一步封裝而成。

        三、棧的介面實現細節

        真正要實現的就是壓棧和入棧操作了,通過調用鏈表的介面就能實現,看下面代碼:

/* * filename: stack.c * author: zhm * date: 2012-01-05 */#include <stdlib.h>#include "list.h"#include "stack.h"/* stack_push */int stack_push(Stack *stack, const void *data){    /* push the data onto the stack */    return list_ins_next(stack, NULL, data);}/* stack_pop */int stack_pop(Stack *stack, void **data){    /* pop the data off the stack */    return list_rem_next(stack, NULL, data);}
        四、棧的應用舉例

        看下面代碼:

/* * filename: main.c * author:zhm * date: 2013-01-05 */#include <string.h>#include <stdlib.h>#include <stdio.h>#include "list.h"#include "stack.h"/* destroy */void destroy(void *data){    printf("in destroy\n");    free(data);    return;}/* main */int main(int argc, char **argv){    Stack stack;    int *int_ptr = NULL;    int ret = 0;    int i;    stack_init(&stack, destroy);    for(i = 0; i < 5; i++ )    {        int_ptr = (int *)malloc(sizeof(int));        if( int_ptr == NULL )            return -1;        *int_ptr = i;        printf("push the data: %d\n",i);        ret = stack_push(&stack, (void *)int_ptr);        if( ret != 0 )            return -1;    }        printf("size of the stack is : %d\n", stack_size(&stack));    //pop the data from top to the bottom    for(i = stack_size(&stack); i > 0; i-- )    {        int_ptr = NULL;        stack_pop(&stack, (void **)&int_ptr);        printf("i = %d, pop the data = %d\n",i,*int_ptr);        free(int_ptr);    }        printf("after pop size of the stack is :%d\n", stack_size(&stack));    return 0;}

        上述main()函數所實現的功能主要是將資料:0,1,2,3,4分別壓入棧中,然後將其一一從棧頂彈出。程式經過編譯運行後,結果如下所示:

        

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.