C語言回顧16 05 04

2021-09-21 02:20:53 字數 1939 閱讀 8875

棧是我們要學習的另一種資料結構,他和鍊錶類似,他最大的特點就是要求先進後出。他的意思就是,這個結構具有棧頂和棧底,只能從棧頂開始插入或者彈出,到棧底這個資料結構就結束了。

乙個棧應該具有以下的操作:建立棧、壓棧、出棧、獲取棧頂元素、刪除棧等。下面我們乙個個來實現。

棧主要分為兩類,靜態棧(線性棧)和動態棧(鏈式棧),他們的區別就和結構體陣列與鍊錶的結構類似,乙個是儲存固定數量的資料,乙個可以靈活增加刪除,我們已經學習的鍊錶就是乙個經典的鏈式結構,下面我們來看看來鏈式棧如何實現:

同樣的,棧也需要乙個特殊的結構體,也需要這個結構體具有指標域,資料域,這一點和鍊錶非常相似。我們完全可以用在鍊錶中使用的那個結構體來實現棧。

typedef struct stack 

stack;

這樣子我們就有了乙個可以構成鏈棧的結構體。

鏈棧的元素新增和鍊錶也很像,也是需要吧後面的節點連線到頭節點後面就行,但是這裡需要注意,棧和鍊錶最不一樣的地方就在於鏈結的方法,因為棧的最大特點就是先入後出,那麼對於插入的方法就有要求,因為我們只能在頭節點的位置來訪問鏈棧,那麼出棧就只能從頭節點開始,那麼如何才能使棧實現先入後出呢?我們可以來看看我們已經了解過的兩種方法;

那麼哪種方法滿足我們先進後出的要求呢,我們可以看看,頭插法先進的在頭節點前面,這與棧的要求不符,我們應該選用尾插法。那麼在棧中,尾插發又是如何實現的呢?

**實現如下:

//我們定義兩個結構體a ,b分別代表棧頂和棧底,c為要插入的節點

void addstack(stack*c)

這樣就完成了棧裡插入乙個元素。

我們的思路是怎樣的呢?應該是先儲存棧頂的指標,然後棧頂向下移動,然後獲取剛才棧頂指標裡的資料後釋放這個指標,就是乙個完整的彈出棧頂元素的操作。

int popstack()

這樣我們就把這個節點裡的資料作為返回值返回了,並且也釋放掉了這塊記憶體。

這個操作很簡單,我們只需要遍歷一次鍊錶,並且把每乙個節點都釋放掉就可以,**實現:

void destroystack()

}

這樣我們就從頭到尾把棧刪除掉了。另外我們還需要在入棧出棧的時候判斷是否棧空與是否棧滿,下面我們看乙個具體的棧的運用,它的作用是判斷一行字串中未配對的(),並用將箭頭指出,基本思路是,遇到『(』就把他進棧,如果遇到『)』,就出棧,當出棧的時候為空,就意味著『)』沒有與之配對的『(』,那麼就找到了錯誤的地方;

#include#includevoid showerrio(char str);

typedef struct info

a;struct list

f;void intlist()

void pushstack(char s)//入棧

void popstack(char str)//出棧

else }

void show()

system("pause");

}void showerrio(char str)

{ int i;

printf("%s\n",str);

for(i=0;i它的執行結果是這樣的,我是提前把字串設定好的,當然也可以從鍵盤錄入:

棧的介紹就到這裡了,資料結構要到運用的時候就會感到複雜了,現在就先了解簡單使用,簡單概念吧。

23 : 18

C語言回顧

1.資料型別對應的位元組數 資料型別 位元組數 unsignd char 1 short int 2 int 4 long int 4 long long int 8 float 4 double 8 long double 12 2.讀取資料格式指定符 short hd int d float f...

c語言回顧

1.資料型別及其範圍 int 10位 2147483648 2147483647 d 4個位元組 long和int都是4位元組,範圍也是一樣,但scanf時候,long是 ld long long是8位元組,輸入 lld,範圍很大,大概是 9 10 18 9 10 18 float是 f,4位元組,...

C語言基礎回顧

這節課講的特別基礎,複習了大概的基本標示符,資料型別,常變數的特性,還有程式的基本結構 於是下面是課後習題 打漁曬網 中國有句俗語叫 三天打魚兩天曬網 某人從1990年1月1日起開始 三天打魚兩天曬網 問這個人在以後的某一天中是 打魚 還是 曬網 include int count day int ...