堆棧:修訂間差異
無編輯摘要 |
無編輯摘要 ? |
||
第3行: | 第3行: | ||
*推入(push):將數據放入堆棧的頂端(陣列形式或串行形式),堆棧頂端top指標加一。 ? | *推入(push):將數據放入堆棧的頂端(陣列形式或串行形式),堆棧頂端top指標加一。 ? | ||
*彈出(pop):將頂端數據資料輸出(回傳),堆棧頂端資料減一。 | *彈出(pop):將頂端數據資料輸出(回傳),堆棧頂端資料減一。 | ||
== | ==堆棧簡介== | ||
[[動態(tài)數據]]區(qū)一般就是“堆?!薄!皸?stack)”和“堆(heap)”是兩種不同的動態(tài)數據區(qū),棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的“棧”,所以每個線程雖然[[代碼]]一樣,但本地變量的數據都是互不干擾。一個堆棧可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態(tài)變量分配在靜態(tài)數據區(qū),本地變量分配在動態(tài)數據區(qū),即堆棧中。[[程序]]通過堆棧的基地址和偏移量來訪問本地變量。 | [[動態(tài)數據]]區(qū)一般就是“堆?!?。“棧(stack)”和“堆(heap)”是兩種不同的動態(tài)數據區(qū),棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的“棧”,所以每個線程雖然[[代碼]]一樣,但本地變量的數據都是互不干擾。一個堆棧可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態(tài)變量分配在靜態(tài)數據區(qū),本地變量分配在動態(tài)數據區(qū),即堆棧中。[[程序]]通過堆棧的基地址和偏移量來訪問本地變量。 | ||
==堆棧原理== | ==堆棧原理== | ||
第119行: | 第119行: | ||
*http://baike.baidu.com/view/93201.htm | *http://baike.baidu.com/view/93201.htm | ||
[[category:數據結構|D]] | [[category:數據結構|D]] | ||
[[category:計算機術語|D]] |
2012年6月5日 (二) 17:58的最新版本
堆棧(英文:stack),也可直接稱棧。在計算機科學中,是一種特殊的串行形式的數據結構,它的特殊之處在于只能允許在鏈結串行或陣列的一端(稱為堆棧頂端指標,英文為top)進行加入資料(push)和輸出資料(pop)的運算。另外堆棧也可以用一維陣列或連結串行的形式來完成。堆棧的另外一個相對的操作方式稱為佇列。由于堆棧數據結構只允許在一端進行操作,因而按照后進先出(LIFO, Last In First Out)的原理運作。它是一種存儲部件,即數據的寫入跟讀出不需要提供地址,而是根據寫入的順序決定讀出的順序。 堆棧數據結構使用兩種基本操作:推入(push)和彈出(pop)
- 推入(push):將數據放入堆棧的頂端(陣列形式或串行形式),堆棧頂端top指標加一。
- 彈出(pop):將頂端數據資料輸出(回傳),堆棧頂端資料減一。
堆棧簡介[ ]
動態(tài)數據區(qū)一般就是“堆?!薄!皸?stack)”和“堆(heap)”是兩種不同的動態(tài)數據區(qū),棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的“?!?,所以每個線程雖然代碼一樣,但本地變量的數據都是互不干擾。一個堆棧可以通過“基地址”和“棧頂”地址來描述。全局變量和靜態(tài)變量分配在靜態(tài)數據區(qū),本地變量分配在動態(tài)數據區(qū),即堆棧中。程序通過堆棧的基地址和偏移量來訪問本地變量。
堆棧原理[ ]
堆棧是一種執(zhí)行“后進先出”算法的數據結構。 它是在內存中開辟一個存儲區(qū)域,數據一個一個順序地存入(也就是“ 推入——push”)這個區(qū)域之中。有一個地址指針總指向最后一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做“棧底”。數據一個一個地存入,這個過程叫做“壓?!?。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的后面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減1。這個過程叫做“彈出pop”。
堆棧分類[ ]
- 陣列堆棧
#include <stdio.h> #include <stdlib.h> /*堆疊資料結構*/ struct Stack { int Array[10];//陣列空間 int Top;//堆疊頂端指標 }; /*檢查堆疊是否為空*/ bool stack_empty(Stack *Stack1) { if(Stack1->Top==0) { return true; } else { return false; } } /*推入資料*/ void push(Stack *Stack1,int x) { Stack1->Top=Stack1->Top+1; Stack1->Array[Stack1->Top]=x; } /*彈出資料*/ int pop(Stack *Stack1) { if(stack_empty(Stack1)) { printf("underflow"); } else { Stack1->Top=Stack1->Top-1; return Stack1->Array[Stack1->Top+1]; } } int main() { struct Stack *Stack1=(struct Stack *)malloc(sizeof(struct Stack));//宣告資料結構空間 Stack1->Top=0;//初始化 push(Stack1,3);//推入3 push(Stack1,4);//推入4 push(Stack1,1);//推入1 push(Stack1,10);//推入10 printf("%d ",pop(Stack1));//彈出10 printf("%d ",pop(Stack1));//彈出1 printf("%d ",pop(Stack1));//彈出4 system("pause"); }
- 串行堆棧
/*鏈棧的結構定義*/ typedef struct { SLink top; // 棧頂指針 int length; // 棧中元素個數 }Stack; void InitStack ( Stack &S ) { // 構造一個空棧 S S.top = NULL; // 設棧頂指針的初值為"空" S.length = 0; // 空棧中元素個數為0 } // InitStack /*能否將鏈棧中的指針方向反過來,不行,如果反過來的話,刪除棧頂元素時,為修改其前驅指針,需要從棧底一直找到棧頂。*/ void Push ( Stack &S, ElemType e ) { // 在棧頂之上插入元素 e 為新的棧頂元素 p = new LNode; // 建新的結點 if(!p) exit(1); // 存儲分配失敗 p -> data = e; p -> next = S.top; // 鏈接到原來的棧頂 S.top = p; // 移動棧頂指針 ++S.length; // 棧的長度增1 } // Push /*在鏈棧的類型定義中設立"棧中元素個數"的成員是為了便于求得棧的長度。*/ bool Pop ( Stack &S, SElemType &e ) { // 若棧不空,則刪除S的棧頂元素,用 e 返回其值, // 并返回 TRUE;否則返回 FALSE if ( !S.top ) return FALSE; else { e = S.top -> data; // 返回棧頂元素 q = S.top; S.top = S.top -> next; // 修改棧頂指針 --S.length; // 棧的長度減1 delete q; // 釋放被刪除的結點空間 return TRUE; } } // Pop