久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔

堆棧:修訂間差異

來自站長百科
跳轉至: 導航、? 搜索
無編輯摘要
無編輯摘要
?
第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

相關詞條[ ]

參考來源[ ]