栈的三种实现方式(C++)

一、基于deque实现

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

 template<class T> class MyStack{
     deque<T> dq;
 public:
     void push(T element){
         dq.push_back(element); //插入尾部 
         //对应的 push_front(const T& x):双端队列头部增加一个元素X
     }
     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();  /* 逐个弹出元素,逐个释放节点内存 */  
 }  

参考文献:
https://www.jianshu.com/p/898f86a4ba86

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值