前面已经提到过顺序栈了,这里简单的说一下链式栈,栈的原理是先进后出,而链式栈不过是以链表的方式实现,没有什么新鲜感 。(把握指针就行)
操作就不再讲解了,直接上代码~
头文件.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是直接写个函数告诉程序没有数据的时候就显示零!