链式栈(c++实现)

栈的特点是后进先出。

【头文件linkstack.h】

// linkstack.h代码
template<class T>class Linkstack;
template<class T>
class stacknode
{
friend class Linkstack<T>;
private:
  T data;
 stacknode<T> *next;
};
template<class T>
class Linkstack
{
public:
    Linkstack():top(0){}; //利用构造函数初始化栈(空)
    ~Linkstack();
    bool Isempty()const; //const成员函数不会修改数据成员
    void push(T item);
    void pop();
    T Top()const;
    void show();
private:
     stacknode<T> *top;
};
/*---------判断栈是否为空-------*/
template<class T>
bool Linkstack<T>::Isempty()const
{
   return top==0;
}
/*---------元素进栈-------*/
template<class T>
 void Linkstack<T>::push(T item)
 {
   stacknode<T> *p=new stacknode<T>();
   cout<<item<<"进栈"<<endl;
   p->data=item;
   p->next=top;
   top=p;

 }
/*---------栈顶元素出栈-------*/
template<class T>
void Linkstack<T>::pop()
{
  if(Isempty())
  {
    cout<<"栈为空"<<endl;
  }
  else
  {  
      stacknode<T> *p=top;
      cout<<top->data<<"出栈"<<endl;
      top=top->next;
      delete p;          //防止内存泄露
   /*内存泄露:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元 */
  }
}
/*---------获取栈顶元素-------*/
template<class T>
T Linkstack<T>::Top()const
{
   if(Isempty())
  {
      throw "栈为空";
  }
  else
  {
    return top->data;
  }
}
/*---------输出栈中的所有元素-------*/
template<class T>
void Linkstack<T>::show()
{
 stacknode<T> *p=top;
 if(Isempty())
  {
    cout<<"栈为空"<<endl;
  }
 else
 {
   cout<<"此时栈中元素为:";
   while(p)
   {
    cout<<p->data<<" ";
    p=p->next;
    }
    cout<<endl;
  }
}
/*-----利用析构函数释放空间-----*/
template<class T>
Linkstack<T>::~Linkstack()  
{
  while(!Isempty())
  {
    pop();  //调用pop函数依次释放栈元素
  }
}

#endif

【主程序】

//main.cpp代码
#include "linkstack.h"
#include<iostream>
using namespace std;
int main()
{
  Linkstack<int> L;
  L.push(1);
  L.push(2);
  L.push(3);
  L.push(4);
  L.show();
  cout<<"栈顶元素为:"<<L.Top()<<endl;

  L.pop();
  cout<<"栈顶元素为:"<<L.Top()<<endl;

   L.push(5);
  cout<<"栈顶元素为:"<<L.Top()<<endl;

  system("pause");
  return 0;
}

【结果图】

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值