链式栈

前面已经提到过顺序栈了,这里简单的说一下链式栈,栈的原理是先进后出,而链式栈不过是以链表的方式实现,没有什么新鲜感 。(把握指针就行)

操作就不再讲解了,直接上代码~

头文件.h

     #pragma once
     #include<iostream>
     using namespace std;
     class LinkNode//节点
     {	
     friend class LinkStack;      友元
     private:	
     LinkNode(const int& thedata, LinkNode* n = 0):data(thedata),next(n){}	初始化构造函数
     int data;//节点数据	
     LinkNode* next;  指向下一节点的指针
     };
     class LinkStack//链式栈
     {
     public:	
     LinkStack():pid(0){}	
     ~LinkStack() { MakeEmpty(); }
     void LinkStackMenu();//菜单	
     void MakeEmpty();//清空
   	bool IsEmpty()const;	判断是否为空
   	void Push();	压栈(在栈顶插入数据)
   	void Pop();	    出栈
   	int& Top()const;//返回栈顶数据
   	private:	
   	LinkNode* pid;//指向数据的指针
   	};
   	void LinkStack::LinkStackMenu()//菜单
   	{	
   	cout << "--------------链式栈操作菜单----------------" << endl;	
   	cout << "--------------------------------------------" << endl;
   		cout << "              (1)压栈  \n";
   		cout << "              (2)出栈  \n";
   		cout << "              (3)获取栈顶数据  \n";	
   		cout << "              (*)-----------  \n";	
   		cout << "              (*)获取栈顶大小  \n";	
   		cout << "              (4)清空栈  \n";	
   		cout << "              (0)退出  \n";	
   		cout << "--------------------------------------------" << endl;	
   		cout << "请输入你的选择:" << endl;
   		}
   		void LinkStack::MakeEmpty()
   		{	
   		while (!(this->IsEmpty()))	
   			Pop();//只要不为空,就一直出栈就ok
   		}
   		bool LinkStack::IsEmpty()const
   		{	
   		return pid == 0;
   		}
   		void LinkStack::Push()
   		{
   			int e;	cin >> e;	
   			pid = new LinkNode(e, pid);//放入数据,指针pid指向放入的数据!
   		}
   		int& LinkStack::Top()const
   		{	
   		if (this->IsEmpty())throw"error";// { cout << "空栈" << endl; 
   		}	
   		return pid->data;
   		}
   		void LinkStack::Pop()
   		{	
   		if (this->IsEmpty())throw"error";	
   		LinkNode* pid2 = pid;//pid2指针保存pid指针的数据	
   		pid = pid->next;	
   		delete pid2;
   		}

主函数.cpp

      #include<iostream>
      #include"链式栈.h"
      using namespace std;
      int main()
      {	
      LinkStack p;
      	while (true)	
      	{		
      	p.LinkStackMenu();		
      	int select;		
      	cin >> select;	
      	switch (select)	
      	{	
      		case 1:	
      		cout << "请输入你要插入的数:" << endl;		
      		p.Push();		
      		system("pause");	
      		system("cls");		
      		break;		
      		case 2:		
      		cout << "出栈--->" << endl;		
      		p.Pop();		
      		system("pause");	
      		system("cls");		
      		break;		
      		case 3:			
      		cout << "栈顶数据为:" << p.Top() << endl;	
      		system("pause");		
      		system("cls");		
      		break;		
      	    case 4:		
      	   	p.MakeEmpty();	
      		cout << "已完成清空操作!" << endl;		
      		system("pause");		
      		system("cls");	
      		break;		
      	    case 0:			
      	    cout << "欲穷千里目,更上一层楼" << endl;	
      		cout << "愿你此次有所收获!再见" << endl;	
      		system("pause");	
     		system("cls");		
     		return 0;		
     		break;		
     		default:			
     		cout << "输入有误,请从新输入!" << endl;	
    		system("pause");	
    		system("cls");	
    		break;		
    		}
    	}	
    	return 0;
    	}

运行结果如下:

在这里插入图片描述
这里阿编只是简单的写了些主要功能。在这里同志们有没有发现一个问题?

如下:
在这里插入图片描述
就是当我们设计的栈为空的时候你让它显示栈顶元素,就会报出这样一个异常!
前面的程序也有这样一个问题,(如前面的单链表,队列等)没有数据你还让它硬显示,不报错更待何时~
关于这个小问题有两个小办法:1是自己设置一个异常处理函数。2是直接写个函数告诉程序没有数据的时候就显示零!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值