1.為什麼要學習棧?
棧是什麼?為什麼要學習它?現在先來說說棧的輝煌作用吧!在計算機領域中,棧是一種不可忽略的概念,無論從它的結構上,還是儲存資料方面,它對於學習資料結構的人們來說,都是非常重要的。那麼就會有人問,棧究竟有什麼作用,讓我們這麼重視它?首先,棧具有非常強大的「記憶」功能,它可以儲存對你有作用的資料,也可以被叫做儲存現場;其次,當咱們呼叫乙個帶參函式時候, 被呼叫的函式的形參,在編譯器編譯的時候,這些形參都需要一定的空間存放他們,這時計算機就會預設幫你儲存到棧中了!
2.棧的定義
棧的作用,這是乙個咱們生活中處處用到,但是卻又沒發現的一種現象,例如當你拿個籃子去買蘋果,那麼你最先挑選的蘋果就是在籃子的最底下,最後挑選的蘋果就在籃子的最上邊,那麼這就造成了這麼一種現象:先拿進籃子的蘋果,要最後才能取出來;相反,最後拿進籃子的蘋果,就能最先取出來!
棧是限定只能在表尾進行插入和刪除的線性表。
我們把允許插入和刪除的一端稱作棧頂(top),另一端稱作棧底(bottom)。不含任何資料元素的棧被稱作空棧,棧也被稱為先進後出的線性表(具有線性關係)。
而棧的特殊性,就是在表中想進行插入和刪除的操作,只能在棧頂進行。這也就使得了:棧底是非常穩定的,因為先進來的元素都被放在了棧底。
棧的插入操作:叫做進棧,也叫作壓棧,入棧。
棧的刪除操作:叫做出棧,也叫彈棧。
3.進棧出棧變化形式
答案是不一定的,這個問題就要細分情況了。棧對線性表的插入和刪除的位置進行了限制,並沒有對元素的進出時間進行限制,這也就是說,在不是所有元素都進棧的情況下,事先進去的元素也可以先出站,只要確保一點:棧元素是從棧頂出棧就可以了!
舉例來說,現在有3個整型數元素1、2、3依次進棧,會有哪些出棧次序呢?
第一種:1、2、3依次進,再3、2、1依次出棧。這是最簡單也最好理解的一種,出棧順序是321。
第二種:1進,1出,2進,2出,3進,3出。也就是進乙個出乙個,出棧順序123.
第三種:1進,2進,2出,1出,3進,3出。出棧次序為213。
第四種:1進,1出,2進,3進,3出,2出。出棧次序為132。
第五種:1進,2進,2出,3進,3出,1出。出棧次序為231。
現在思考一下,有沒有312這樣的出棧次序?
答案是肯定不會的。因為3先出棧,就意味著3曾經進棧,既然3都進棧了,那就意味著1、2已經進棧了,此時,2一定是在1的上面,就是更接近棧頂,那麼出棧只能是321,不然不滿足123依次進棧的要求,所以此時不會發生1比2先出棧的情況。
上述的這個簡單例子,就可以看出來,只是3個棧元素,就有5種可能的出棧次序,如果元素量多,那麼出棧的變化將會更多。
對於棧來講,理論上線性表的操作特性它都具備,但是由於它的特殊性,所以針對它的操作上,也會有些變化。特別是插入和刪除的操作,我們改名為push和pop,英文翻譯為壓和彈!
由於棧也是線性表,那麼咱們之前講的線性表的順序儲存和鏈式儲存,對於棧來說,必然也是同樣適用的!
既然棧是線性表的特例,那麼棧的順序儲存其實也是線性表順序儲存的簡化,我們簡稱為順序棧。線性表是用陣列來實現的,那麼對於棧這種只能一頭進行插入和刪除的線性表來說,咱們一般也是用陣列下標為0的一端,作為棧底。
那麼此時,我們定義乙個stacksize表示陣列的元素個數,top變數來指示棧頂元素在陣列中的位置,那麼就意味著top可以變大變小。如果此棧存在元素,那麼top必然要小於stacksize,棧為空則top=-1,棧存在乙個元素,top=0。
棧的結構定義:
typedef int selemtype; /* selemtype 型別根據實際情況而定,這裡假設為int */
typedef struct
selemtype data[maxsize];
int top; /* 棧頂指標 */
}sqstack;
1.棧的順序儲存結構進棧操作
若現在有乙個棧,stacksize是5,那麼棧的普通情況、空棧、滿棧的情況分別如下:
對於棧的插入,即進棧操作,有如下所示:
因此對於進棧的操作push,其**如下:
/*1.棧的順序儲存結構出棧操作對於棧的刪除,即出棧操作,有如下**:插入元素e為新的棧頂元素
*/status push(sqstack *s,selemtype e)
s->top++; /*
棧頂指標增加一
*/s->data[s->top] = e; /*
將新元素e插入並賦值給棧頂空間
*/return
ok;}
/*1.棧出鏈式儲存結構棧的鏈式儲存結構,簡稱為鏈棧。鏈棧簡單的講,就是將棧和鍊錶合二為一的使用,那麼此時為了簡單,通常就把棧頂放在了鍊錶的頭指標位置,此時棧頂指標就替代了頭指標,那麼此時資料依次從棧頂進入,而且此時對於鍊錶來說也就不再需要頭結點了。先判斷棧是否為空,不空則刪除s的棧頂元素,用e返回其值,並返回ok,否則返回error
*/statck pop(sqstack *s, selemtype *e)
對於鏈棧來說,鏈棧的操作絕大部分都和單鏈表類似,而且基本上不存在棧滿的情況,除非記憶體已經沒有可以使用的空間。
對於空棧來說,鍊錶原定義是頭指標指向空,那麼鏈棧的空其實就是top=null的時候。
對比一下順序棧與鏈棧,它們在時間複雜度上是一樣的,均為o(1)。對於空間效能,順序棧需要事先確定乙個固定的長度,可能會存在記憶體空間浪費的問題,但它的優勢是訪問時定位很方便,而鏈棧則要求每個元素都有指標域,這同時也增加了一些記憶體開銷,但對於棧的長度無限制。所以它們的區別和線性表中討論的一樣。如果棧的使用過程中元素變化不可預料,有時很小,有時非常大,那麼最好是用鏈棧,反之,如果它的變化在可控的範圍內,建議使用順序棧會更好一些。
/*note:your choice is c ide
*/#include
"stdio.h
"#include
"stdlib.h
"typedef
struct
personperson;
person *head;
void main()//
棧頂是頭指標
else
break
;
case2:
if(head==null)
pa=head;
pb=head->next;
head=head->next;
printf(
"-%d-
",pa->arr);
free
(pa);
break
;
case3:
pa=head;
printf(
"\n列印從棧頂到棧底的元素\n");
while
(pa)
printf("\n
");break
; }}}
#include "stdio.h
"#define max 5typedef
struct
personperson;
person p;
void main(void
)else
break
;
case2:
e=p.arr[p.top];
printf(
"刪除的元素是%d\n
",e);
p.top--;
break
;
case3:
printf(
"\n列印從棧頂到棧底的元素\n");
for(i=p.top;i>=0;i--)
printf("\n
");break
; }}}
資料結構 棧 棧
可以把棧想像成乙個桶 進棧 就是把和桶口一樣大的燒餅往桶裡面扔 出棧 就是把燒餅拿出來 特點 先進後出。先扔進去的燒餅最後才能拿出來,最後扔進去的燒餅,第乙個拿出來 剛開始top 1 top 1 然後把進棧的元素賦值給data top 入棧操作 void push stack s,int x els...
資料結構 棧
例子 棧是一種被限制在只能在表的一端進行插入和刪除運算的線性表。區域性變數是用棧來儲存的 可以進行插入和刪除的一端稱為 棧頂 top 另一端稱為 棧底 bottom 當表中沒有元素時 表長為0的棧 稱為 空棧。棧的修改是按 後進先出的原則進行,因此棧被稱為後進先出 last in first out...
資料結構 棧
1.棧stack 是限定僅在表尾進行刪除和插入操作的線性表。允許插入刪除的一端叫做棧頂top,另外一端叫做棧底bottom。棧又稱為後進先出 lifo 的線性表。即表尾是指棧頂。2.順序棧 定義 top指向可存入元素的位置。typedef struct stacktypestacktype 插入 進...