链栈本质上就是操作受限的不带头结点的单链表。
表尾对应栈底,首元结点代表栈顶top。
头文件:LinkStack.hpp
#pragma once
#include<iostream>
using namespace std;
template<class T>
class Node
{
public:
Node() {}
Node(T d) { data = d; }
T data;
Node* next;
};
template<class T>
class LinkStack
{
public:
LinkStack() { top = NULL; }
void push(T d); //入栈
T pop(); //出栈
T get_top(); //获取栈顶元素
bool is_empty();//判断栈是否为空
~LinkStack(); //析构函数
private:
Node<T>* top;
};
template<class T>
void LinkStack<T>:: push(T d)
{
Node<T>* p = new Node<T>(d);
p->next = top;
top = p;
}//入栈
template<class T>
T LinkStack<T>::pop()
{
if (top == NULL)
throw "underflow error";
Node<T>* p = this->top;
T d = p->data;
this->top = this->top->next;
delete p;
return d;
}//出栈
template<class T>
T LinkStack<T>::get_top()
{
if (top == NULL)
throw "underflow error";
return top->data;
}//获取栈顶元素
template<class T>
bool LinkStack<T>::is_empty()
{
if (top == NULL)
return true;
else return false;
}//判断栈是否为空
template<class T>
LinkStack<T>::~LinkStack()
{
Node<T>* p = NULL;
while (top)
{
p = top;
top = top->next;
delete p;
}
}//析构函数
编写测试用main函数:
#include"LinkStack.hpp"
int main()
{
LinkStack<int> s;
//pop异常处理机制测试
try
{
s.pop();
}
catch (const char* err)
{
cout << err << endl;
}
for (int i = 1; i <= 10; i++)
{
s.push(i);
}
cout <<"get_top: " << s.get_top() << endl;
while (!s.is_empty())
cout << s.pop() << endl;
//get_top异常处理机制测试
try
{
cout << s.get_top() << endl;
}
catch (const char* err)
{
cout << err << endl;
}
return 0;
}
程序运行结果:
当你感到迷茫时,不要停下来,因为这正是你需要向前迈进的时候。当你感到害怕时,不要放弃,因为这是你需要坚持下去的时候。当你感到疲惫时,不要退缩,因为这是你需要再接再厉的时候。记住,每一步都是向着成功不断前进的机会,不要浪费它们。
祝大家学习愉快^_^