栈的三种实现

作者: saviochen | 来源:发表于2017-07-16 16:06 被阅读73次

一、基于deque实现

优点:利用deque动态管理内存,栈的内存无上限,STL中的栈也是基于deque实现的。

 template<class T> class MyStack{
     deque<T> dq;
 public:
     void push(T element){
         dq.push_back(element);
     }
     void pop(){
         assert(!empty());
         dq.pop_back();
     }
     bool empty(){
         return dq.empty(); 
     }
     T& top(){
         assert(!empty());
         return dq.back();
     }
 };

二、基于数组实现

数组可选静态数组或动态数组,两种实现方式类似,都需要预选设定一个栈的最大容量。优点在于:实现简单,支持随机存储;缺点是空间受限。

typedef int TYPE;
const int STACK_SIZE = 100;
TYPE MysSack[STACK_SIZE]; 
int top_pos = -1;  

bool isEmpty(){
    return top_pos == -1;
}
bool isFull(){
    return top_pos == STACK_SIZE - 1;
}
 void push(TYPE element){
     assert(!isFull());
     MysSack[++top_pos] = element;
 }
 void pop(){
     assert(!isEmpty());
     --top_pos;
 }
 TYPE& top(){
     assert(!isEmpty());
     return MysSack[top_pos];
 }

3、基于链表实现

优点是:存储空间不收限制;缺点是,需要存储额外的链接信息,并且
销毁栈需要O(n)的时间。

 typedef int TYPE;
 typedef struct STACK_NODE {   
     TYPE value;  
     struct STACK_NODE *next;  
 } StackNode;  
 static StackNode *MyStack;  

 int isEmpty(void){  
     return MyStack == NULL;  
 }  
 int isFull(void){  
     return FALSE;  
 }
 void pop(void)  {  
     StackNode *first_node;  
     assert(!isEmpty());  
     first_node = MyStack;  
     MyStack = first_node->next;  
     free(first_node);  
 }  
 void push(TYPE value) {  
     StackNode *new_node;  
     new_node = (StackNode *)malloc(sizeof(StackNode));  
     if(new_node == NULL)  
         perror("malloc fail");  
     new_node->value = value;  
     new_node->next = MyStack;  /* 新元素插入链表头部 */  
     MyStack = new_node;       /* stack 重新指向链表头部 */  
 }  
 TYPE top(void)  {  
     assert(!isEmpty());  
     return MyStack->value;  
 }  
 void destroy_stack(void)  {  
     while(!isEmpty())  
         pop();  /* 逐个弹出元素,逐个释放节点内存 */  
 }  

相关文章

  • 栈的三种实现

    一、基于deque实现 优点:利用deque动态管理内存,栈的内存无上限,STL中的栈也是基于deque实现的。 ...

  • 算法学习笔记-基础开篇

    算法定义 基础问题 三种基础的抽象数据类型:背包、队列、栈 用数组、变长数组、链表实现背包、队列、栈的api。 数...

  • 树-三大遍历

    三种遍历都有递归、栈、循环三种方式,其中,递归最为简单,栈次之,循环最为麻烦。递归的深度如果太大则会导致栈溢出;栈...

  • 数据结构——栈和队列

    用数组实现栈和队列 用栈实现队列 用队列实现栈 栈和队列的经典算法题最小间距栈宠物收养所 数组实现栈和队列 用数组...

  • Swift 队列&栈 相关操作

    栈 LIFO(后进先出) 队列 FIFO(先进先出) 队列与栈相互的实现 栈 - 队列实现 队列 - 栈实现 相关...

  • Algorithm小白入门 -- 队列和栈

    队列和栈队列实现栈、栈实现队列单调栈单调队列运用栈去重 1. 队列实现栈、栈实现队列 队列是一种先进先出的数据结构...

  • 2018-07-09顺序表实现栈

    栈的实现 ——直接用顺序表(列表list)进行 栈结构实现 栈可以用顺序表实现,也可以用链表实现。 栈的操作 St...

  • 38_两个有趣的问题

    关键词:通过栈实现队列、通过队列实现栈 0. 通过栈实现队列 用栈实现队列等价于用后进先出的特性实现先进先出的特性...

  • 数据结构重学日记(二十一)二叉树的非递归遍历

    二叉树的非递归遍历也分为三种方式:前序、中序和后序。需要借助栈来实现。 那么新建个文件,把之前栈的代码复制过来,再...

  • 栈 Python实现

    栈的顺序表实现 栈的链接表实现

网友评论

    本文标题:栈的三种实现

    本文链接:https://www.haomeiwen.com/subject/zqntkxtx.html