1. 程式人生 > >資料結構與演算法 -- 棧 ADT

資料結構與演算法 -- 棧 ADT

程式碼實現說明: 也很簡單,一句話動態分配記憶體,使用陣列下標
/* 堆疊的長度在建立堆疊的函式被呼叫時給出,該函式必須在任何其他操作堆疊的函式被呼叫之前呼叫 */    
#include <stdio.h>    
#include <assert.h>    
#include <stdlib.h>    
    
#define STACK_TYPE int /* 堆疊所儲存的值的資料型別 */      
    
/* 用於儲存堆疊元素的陣列和指向堆疊頂部元素的指標 */      
static STACK_TYPE *stack;    
static int stack_size;    
static int top_element = -1;    
    
/*   
   建立對棧,引數指定對棧可以儲存多少個元素   
   注意:此函式只適用於動態分配陣列形式的堆疊。  
 */    
void create_stack (size_t size);    
    
/*  
   銷燬一個堆疊,釋放堆疊所適用的記憶體  
   注意,此函式只適用於動態分配陣列和連結串列結構的堆疊。  
 */    
void destroy_stack (void);    
    
/* 將一個新值壓入堆疊中,引數是被壓入的值。*/      
void push (STACK_TYPE value);    
    
/* 彈出堆疊中棧頂的一個值,並丟棄。*/      
void pop (void);    
    
/* 返回堆疊頂部元素的值,但不改變堆疊結構。*/      
STACK_TYPE top (void);    
    
/* 如果堆疊為空,返回TRUE,否則返回FALSE。*/     
int is_empty (void);    
    
/* 如果堆疊為滿,返回TRUE,否則返回FALSE。*/      
int is_full (void);    
    
/* 自定義函式實現遍歷操作 */    
void travel (void);    
    
/* 計算棧中元素的個數 */    
int size (void);    
    
int main (void)    
{    
    create_stack (50);    
    travel ();      
    pop ();      
    printf("%s\n", is_empty() ? "棧為空" : "棧未空");       
    
    int i = 0;      
    for (i = 0; i <= 9; i++)      
    {      
        push (i);      
    }      
    puts ("push 壓棧後的數值為: ");      
    travel ();      
    printf ("此時棧頂元素為:%d\n", top ());      
    printf ("此時棧元素個數為:%d\n", size ());      
    
    pop ();      
    pop ();      
      
    puts ("經過pop彈出幾個元素後的棧元素: ");      
    travel ();      
    
    printf("%s\n", is_full() ? "棧為滿" : "棧未滿");      
    printf("%s\n", is_empty() ? "棧為空" : "棧未空");       
          
    printf ("此時棧頂元素為:%d\n", top ());      
    printf ("此時棧元素個數為:%d\n", size ());      
    destroy_stack ();    
    printf ("此時棧元素個數為:%d\n", size ());      
    return 0;      
}    
    
void create_stack (size_t size)    
{    
    //assert (stack_size == 0);    
    if (size < stack_size)    
    {    
        printf ("棧元素個數太少\n");    
        return ;    
    }    
    stack_size = size;    
    stack = (STACK_TYPE *)malloc (stack_size * sizeof (STACK_TYPE));    
    if (NULL == stack)    
        perror ("malloc分配失敗"), exit (1);    
}    
    
void destroy_stack (void)    
{    
    //assert (stack_size > 0);    
    if (stack != NULL)    
    {    
		printf ("銷燬堆疊\n");
        stack_size = 0;    
        free (stack);    
        stack = NULL;    
        top_element = -1;    
    }  
}    
    
void push (STACK_TYPE value)    
{    
    //assert (!is_full ());    
    if (is_full ())    
    {    
        printf ("棧已滿,入棧失敗\n");      
        return ;    
    }    
    top_element += 1;    
    stack[top_element] = value;    
}    
    
void pop (void)    
{    
    //assert (!is_empty ());    
    if (is_empty ())      
    {      
        printf ("棧已空,出棧失敗\n");      
        return ;      
    }      
    top_element -= 1;    
}    
    
STACK_TYPE top (void)    
{    
    //assert (!is_empty ());    
    if (is_empty ())    
    {    
        printf ("棧已空,出棧失敗\n");    
        return ;    
    }    
    return stack[top_element];    
}    
    
int is_empty (void)    
{    
    //assert (stack_size > 0);    
    if (stack != NULL)    
    {    
        return top_element == -1;    
    }    
}    
    
int is_full (void)    
{    
    //assert (stack_size > 0);    
    if (stack != NULL)    
    {    
        return top_element == stack_size - 1;    
    }  
}    
    
void travel (void)    
{    
    int i = 0;      
    if (top_element == -1)      
        printf ("這個棧為空");      
    for (i = 0; i <= top_element; i++)      
        printf ("%d ", stack[i]);      
    printf ("\n");     
}    
    
int size (void)    
{    
    return top_element + 1;    
}    
輸出結果:
這個棧為空
棧已空,出棧失敗
棧為空
push 壓棧後的數值為: 
0 1 2 3 4 5 6 7 8 9 
此時棧頂元素為:9
此時棧元素個數為:10
經過pop彈出幾個元素後的棧元素: 
0 1 2 3 4 5 6 7 
棧未滿
棧未空
此時棧頂元素為:7
此時棧元素個數為:8
銷燬堆疊
此時棧元素個數為:0

相關推薦

資料結構演算法 -- ADT

程式碼實現說明: 也很簡單,一句話動態分配記憶體,使用陣列下標 /* 堆疊的長度在建立堆疊的函式被呼叫時給出,該函式必須在任何其他操作堆疊的函式被呼叫之前呼叫 */ #include <stdio.h> #include <assert.h> #include

java版資料結構演算法(判斷括號是否匹配)

/** * 括號是否匹配 {} () [] */ class IsMatch { private char arr[]; private int maxSize; private int top; public IsMatch(int size){

資料結構演算法 -- 的應用(進位制轉換、括號匹配)

棧的應用 ps:用棧很簡單實現的應用有很多,比如說進位制轉換,括號匹配等。學計算機的都知道,2進位制,8進位制,10進位制,16進位制等,進位制之間的轉換也是需要掌握的,以備不時之需,所以我們可以自己寫一段程式如果會android的話,可以直接打包成APK。下面就按照這兩個應用稍微寫一點C語言的程式碼。 進

Javascript資料結構演算法--的實現用法

棧資料結構 棧是一種遵從後進先出(LIFO)原則的有序集合。新新增的或者待刪除的元素都儲存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧裡,新元素都靠近棧頂,舊元素都接近棧底。 我們在生活中常能看到棧的例子。整齊堆起來的書,廚房堆起的盤子等 棧也被用在程式語言的編譯器和記憶體中儲存變數、方法呼叫等。 /**

java資料結構演算法——佇列

本節目標:1.掌握棧的原理與應用2.掌握佇列的原理與應用棧和佇列都屬於線性表棧棧又稱為堆疊,是一種運算受限的線性表,這是因為它僅允許線上性表的固定一端(表尾)進行插入、刪除和讀取元素等運算,不允許在其他任何位置進行運算。相關名詞:棧頂、棧頂元素、棧底、進棧(壓棧)、出棧(退棧

資料結構演算法

什麼是棧   百度百科上,棧是這麼定義的:   棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧

資料結構演算法 - 和佇列

棧(stack) 先進後出,刪除與加入均在棧頂操作   棧也稱為堆疊,是一種線性表。 堆疊的特性: 最先放入堆疊中的內容最後被拿出來,最後放入堆疊中的內容最先被拿出來, 被稱為先進後出、後進先出。 堆疊中兩個最重要的操作是PUSH和POP,兩個是相反的操作。 PUSH:在堆疊的頂部加

資料結構演算法分析c語言描述(Mark Allen)--ADT陣列實現

棧ADT陣列實現 使用陣列儲存 操作集合 入棧push 出棧pop 清空 初始化 返回棧頂元素 得到一個隨機棧 列印整個棧 #include <stdio.h> #include <stdlib.h> #include <

資料結構演算法分析 - 2 - ADT

1.描述:實質是一種受到限制的表,即插入刪除只能在表的末端,能夠實現LIFO(後進先出) 2.棧的實現   連結串列實現(鏈棧)   陣列實現(順序棧)   3.鏈棧 建立一個空棧 1 struct Node 2 { 3 int value; 4 N

資料結構演算法分析c語言描述(Mark Allen)--ADT連結串列實現

棧ADT連結串列實現 使用連結串列儲存 操作集合 入棧push 出棧pop 清空 初始化 返回棧頂元素 列印整個棧 #include <stdio.h> #include <time.h> #include <stdli

為什麼我要放棄javaScript資料結構演算法(第三章)——

有兩種結構類似於陣列,但在新增和刪除元素時更加可控,它們就是棧和佇列。 第三章 棧 棧資料結構 棧是一種遵循後進先出(LIFO)原則的有序集合。新新增的或待刪除的元素都儲存在棧的同一端,稱為棧頂,另一端就叫做棧底。在棧裡, 新元素都靠近棧頂,舊元素都接近棧底。 棧也被用在程式語言的編譯器和記憶體中儲存

資料結構演算法(2)—— (java)

1 棧的實現 1.1 簡單陣列實現棧 package mystack; public class ArrayStack { private int top; //當前棧頂元素的下標 private int[] array; public ArraySt

資料結構演算法》之抽象資料型別(ADT

抽象資料型別(abstract data type,ADT)是帶有一組操作的一些物件的集合。抽象資料型別是數學的抽象,只不過這種資料型別帶有自己的操作。比如表、集合、圖以及與它們各自的操作一起形成的這些物件都可以看做抽象資料型別,就像整數、實數、布林數等都是資料型別一樣。整數、實數、布林數都有各自相

資料結構演算法分析c語言描述(Mark Allen)--佇列ADT連結串列實現

佇列ADT連結串列實現 使用連結串列儲存 操作集合 入隊 出隊 初始化 返回隊前元素 列印 #include <stdio.h> #includ

資料結構演算法分析c語言描述(Mark Allen)--迴圈佇列ADT陣列實現

迴圈佇列ADT陣列實現 使用陣列儲存 操作集合 入隊 出隊 清空 初始化 返回隊前元素 列印 重點注意! 對於一個迴圈佇列 front == rear時候佇列

07_資料結構演算法__Python實現

#Created By: Chen Da """ 棧區 LIFO結構 ADT: method:push、pop """ #先實現一個雙端連結串列 class Node(object): def __init__(self,prev=None,va

資料結構演算法

1、如何理解“棧”?    棧是一種典型“後進者先出,先進者後出”的結構。從棧的操作特性上來看,棧是一種“操作受限”的線性表,只允許在一端插入和刪除資料。 2、如何讓實現一個“棧”?    對於棧,主要包含兩個操作,入棧和出棧,也就是在棧頂插入

java版資料結構演算法—佇列、兩個實現一個佇列

/** * 佇列:先進先出 */ class MyQueue { int a[]; int maxSize; //大小 int front; //開頭 int rear; //結尾 int nItems; //元素個數 //初始化

java版資料結構演算法—連結串列實現

package com.zoujc; /** * 用連結串列實現棧 */ class MyLinkStack { private Link first; public MyLinkStack(){ first = null; } //判空

資料結構演算法之美》-

《資料結構與演算法之美》- 棧 棧,在這裡說的是一種資料結構。 你還可能知道的棧 提到“棧”,做Java的同學還會想起Java記憶體模型中的“棧”,與之緊密關聯的還有一個名詞——堆,但是這裡,此棧非彼棧。 引用《深入理解Java虛擬機器》中有關棧的介紹 經常有人把Java