栈之链栈

链栈

链式栈是线性表的链接存储表示形式。我们采用链式栈来表示一个栈,有利于结点的插入和删除。用链接表示不但能提高效率。还可达到共享的目的。如图所示为一个链式栈。


从图中可以获知,链式栈的栈顶在链表的表头。那么新结点的插入和结点的删除都在链表的表头,也就是栈顶进行的。

下面给出链栈的实现:


#ifndef LINKSTIC_H
#define LINKSTIC_H
#include<iostream>
#include<assert.h>
using namespace std;
template<typename T> struct stacknode{
                  T data;
                  stacknode *link;
                  stacknode(T d=0,stacknode<T> *next=NULL):link(next),data(d){}
                  };
                  template<typename T> class linkedstack
                                    {
                                             public:
                                          linkedstack():top(NULL){}
                                          ~linkedstack(){makeempty();};
                                          void Push(const T &x);
                                          bool Pop(T &x);
                                          bool gettop(T &x)const;
                                          bool Isempty()const{return (top==NULL)?true:false;}
                                          int getsize()const;
                                          void makeempty();
                                          friend ostream& operator<<(ostream& os,linkedstack<T> &s){
                                                    
                              stacknode<T> *p=s.top;int i=0;
                              while(p!=NULL)
                              {
                                  os<<++i<<":"<<p->data<<endl;
                                  p=p->link;
                                  }
                                  return os;
                                  }
                                          private:
                                             stacknode<T> *top;
                                             };
                                             #endif
                                             template<typename T> void linkedstack<T>::makeempty()
                                             {
                                              stacknode<T> *p;
                                              while(top!=NULL)
                                              {
                                                  p=top;
                                                  top=top->link;
                                                  delete p;
                                                  }
                                                  };
          template<typename T> void linkedstack<T>::Push(const T &x)
          {
                top=new stacknode<T>(x,top);
                assert(top!=NULL);
                };
                template<typename T> bool linkedstack<T>::Pop(T &x)
                {
                   if(Isempty()==true)  return false;
                   stacknode<T> *p=top;
                   top=top->link;
                   x=p->data;
                   delete p;
                   return true;
                   };
                   template<typename T> bool linkedstack<T>::gettop(T &x)const
                   {
                        if(Isempty()==true)  return false;
                        x=top->data;
                        return true;
                        };
                        template<typename T> int linkedstack<T>::getsize()const{
                         stacknode<T> *p=top;int k=0;
                         while(top!=NULL)
                         {
                           top=top->link;
                           k++;
                           }
                           return k;
                           };


#include<iostream>
#include"LINKSTIC.h"
#include<stdlib.h>
using namespace std;
int main()
{
    linkedstack<int> list;
    int i,n,k=1;
    
    cin>>n;
    for(int j=0;j<n;j++)
    {
            cin>>i;
            list.Push(i);
            }
            list.Pop(k);
            
            cout<<list<<endl;
            system("pause");
            }
            



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值