堆棧問題詳解

堆棧是一種執行“後進先出”算法的數據結構。

堆棧

堆棧是一種執行“後進先出”算法的數據結構。

設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裏面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以“先進後出”就是這種結構的特點。

堆棧就是這樣一種數據結構。它是在內存中開闢一個存儲區域,數據一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指針總指向最後一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做“棧底”。數據一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的後面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則。

堆棧是計算機中最常用的一種數據結構,比如函數的調用在計算機中是用堆棧實現的。
堆棧可以用數組存儲,也可以用以後會介紹的鏈表存儲。
下面是一個堆棧的結構體定義,包括一個棧頂指針,一個數據項數組。棧頂指針最開始指向-1,然後存入數據時,棧頂指針加1,取出數據後,棧頂指針減1。

#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};

empty()函數是將堆棧清空的函數,push()函數是壓入堆棧的函數,pop()函數是將數據取出的函數。peek()函數是讀棧頂元素的函數。
isEmpty()是判斷堆棧是否爲空的函數,爲空則返回真,否則返回假.
其中DATA_TYPE是堆棧中數據的類型,依據你的問題而定義.比如如果堆棧中存入char型元素,那就定義typedef char DATA_TYPE
typedef int BOOL是在定義一個類似邏輯類型的數據類型,由於c語言中沒有邏輯類型, 而且
以下是堆棧全部程序:

#include<stdio.h>
#define MAX_SIZE 100
#define TRUE 1
#define FALSE 0
typedef int DATA_TYPE;
typedef int BOOL;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};

DATA_TYPE peek(struct stack *sta)
{
return (*sta).data[(*sta).top];
}
void empty(struct stack *sta)
{
(*sta).top = -1;
}

BOOL isEmpty(struct stack *sta)
{
if((*sta).top == -1)
return TRUE;
else
return FALSE;
}

void push(struct stack *sta,DATA_TYPE data)
{
if((*sta).top==MAX_SIZE-1)
printf("堆棧已經滿n");
else
(*sta).data[++(*sta).top] = data;
}

DATA_TYPE pop(struct stack *sta)
{
if((*sta).top == -1)
{
printf("堆棧已經空了n");
return -1;
}
else
return (*sta).data[(*sta).top--];
}



void main()
{
struct stack st;
empty(&st);
push(&st,3);
push(&st,5);
push(&st,7);
printf("%dn",pop(&st));
printf("%dn",pop(&st));
printf("%dn",pop(&st));
}


思考題:
堆棧通常用於解析某字符串.請用堆棧來檢查某字符串中的括號是否匹配,如果不匹配,輸出該不匹配的位置.
比如字符串:a{b(c[d]e)f}就是匹配的,而{99]就是不匹配的.
思路:從字符串中從左到右讀取字符,每次讀取一個字符,如果發現它是左括號(是"[{("中的一個),就壓入堆棧中.當從輸入中讀到右分隔符(是")}]"中的一個)時,就彈出棧頂的左分隔符,看一看是否匹配,如果它們不匹配(如一個是小括號,另一個是中括號),就報錯,輸出錯誤的列是幾.如果讀到末尾,還一直存在沒有被匹配的分隔符,程序也報錯.分隔符沒有被匹配,表現爲把整個字符串都讀入後,堆棧中仍有分隔符.
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章