堆栈
操作
堆叠数据结构使用两种基本操作:推入(push)和弹出(pop):
推入:将数据放入堆叠的顶端(阵列形式或串列形式),堆叠顶端top指标加一。
弹出:将顶端数据资料输出(回传),堆叠顶端资料减一。
特点
栈的基本特点:
先入后出,后入先出。
除头尾节点之外,每个元素有一个前驱,一个后继。
抽象定义
以下是堆栈的VDM( Vienna Development Method ( 英语 : Vienna Development Method ) ):
函数签名:
此处的N代表某个元素(如自然数),而U表示集合求交。
语义:
软件堆栈
阵列堆叠
堆栈可以用链表和数组两种方式实现,一般为一个堆栈预先分配一个大小固定且较合适的空间并非难事,所以较流行的做法是 Stack 结构下含一个数组。如果空间实在紧张,也可用链表实现,且去掉表头。这里的例程是以数组实现的。
#include#include#include#define stack struct Stack#define STACK_POP_ERR 42/* 堆疊資料結構 堆栈数据结构 */structStack{intval[10];// 陣列空間inttop;// 堆疊頂端指標(栈顶)};/* 檢查堆疊是否為空 */boolempty(stack*stk){returnstk->top==0;}/* 推入資料 */voidpush(stack*stk,intx){stk->top=stk->top+1;stk->val[stk->top]=x;}/* 彈出并返回資料 */intpop(stack*stk){if(empty(stk))returnSTACK_POP_ERR;// 不能彈出else{stk->top=stk->top-1;returnstk->val[stk->top+1];}}intmain(){// 宣告并初始化資料結構空間stackstk;stk.top=0;// 推入四个push(&stk,3);push(&stk,4);push(&stk,1);push(&stk,9);// 弹出三个printf("%d ",pop(&stk));printf("%d ",pop(&stk));printf("%d ",pop(&stk));return0;}
串列堆叠
/* 链栈的结构定义 */typedefstruct{SLinktop;// 棧頂指針intlength;// 棧中元素個數}Stack;// 构造空栈 SvoidInitStack(Stack&S){S.top=NULL;// 設棧頂指針的初值為"空"S.length=0;// 空棧中元素個數為0}// 如果指针反过来从栈底到栈顶的话,删除栈顶元素时,为修改其前驱指针,需要从栈底一直找到栈顶。// 在棧頂S 之上插入元素e為新的棧頂元素,並返回成功與否boolPush(Stack&S,ElemTypee){p=newLNode;// 建新的結點if(!p)returnfalse;// 存儲分配失敗p->data=e;p->next=S.top;// 鏈接到原來的棧頂S.top=p;// 移動棧頂指針++S.length;// 棧的長度增1}// 在链栈的类型定义中设立“栈中元素个数”的成员是为了便于求得栈的长度。// 刪除S 棧頂且以e 返回其數值,返回成功與否boolPop(Stack&S,SElemType&e){if(!S.top)returnfalse;else{e=S.top->data;// 返回棧頂元素q=S.top;S.top=S.top->next;// 修改棧頂指針--S.length;// 棧的長度減1deleteq;// 釋放被刪除的結點空間returntrue;}}
堆栈有时候也常用来指代堆栈段。
硬件堆栈
架构层次上的堆栈通常被用以申请和访问内存。
硬件支持
大多数CPU都有用作堆栈指针的寄存器。
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值