链栈
//共三个文件,分别为stack.h、stack1.cpp、main.cpp
//栈的描述请参阅文章:http://blog.csdn.net/larry233/article/details/50909550
//2016/6/29/0:00
//stack.h 定义链栈类stack的界面
typedef int element; //定义一个别名,这样的话,如果要用其他类型的栈,只需要将int改为其他类型即可
struct Node //链栈结点
{
element data; //存放链栈的元素
Node *link; //指向下一个结点的链
};
class stack{
public:
//构造函数,设置栈顶为空指针
stack();
//析构函数,释放链栈结点占用的存储空间
~stack();
//判断链栈是否为空
bool isEmpty();
//返回当前栈顶的值
//要求:栈非空
element get_top();
//将元素x入栈
void push(element x);
//将栈顶元素出栈
//要求:栈非空
void pop();
//自顶向底打印链栈中的元素
void print();
private:
Node *top;
};
// #stack1.cpp 定义stack类的成员函数
#include"stack.h"
#include<iostream>
using namespace std;
stack::stack()
{
top = NULL; //将栈顶置为空
}
stack::~stack()
{
Node *ptr; //指定链栈结点的临时指针
while (top){ //从顶至底释放链栈的结点
ptr = top; //先用ptr记录栈顶结点
top = top->link; //摘下栈顶结点,将下一结点作为新的栈顶
delete ptr; //释放原栈顶结点
}
}
bool stack::isEmpty()
{
if (!top) //如果栈顶结点为空,返回真
return true;
return false;
}
element stack::get_top()
{
if (isEmpty()){ //如果链栈为空,给出报错信息
cout << "error: No element!\n";
return -1;
}
else
return top->data; //如果非空,返回栈顶结点存放的元素
}
void stack::push(element x)
{
Node *ptr = new Node; //创建一个新结点
if (ptr){ //如果成功分配了内存
//在栈顶加入一个新的结点并连成链
ptr->link = top;
ptr->data = x;
top = ptr;
}
else{ //内存分配失败(如:没有足够的内存)时给出错误信息
cout << "error: No enough memory!\n";
return;
}
}
void stack::pop()
{
Node *ptr;
if (top){ //栈非空时才能出栈
ptr = top; //指向栈顶结点
top = top->link; //摘下原来的栈顶结点
delete ptr; //释放原来栈顶结点
}
else{ //栈为空时给出错误信息
cout << "error: Pop element from empty stack!\n";
return;
}
}
void stack::print()
{
Node *loop;
loop = top; //指向栈顶结点
while (loop){
cout << loop->data<<" "; //输出当前结点存放的数据
loop = loop->link; //指向下一结点
}
cout << "\n";
}
//main.cpp 演示链栈
#include"stack.h"
#include<iostream>
using namespace std;
const int max_input = 5; //定义用户最大的输入次数,即链栈中元素的个数
int main()
{
stack S; //声明一个整型的链栈
element user_input;
int loop;
for (loop = 0; loop != max_input; ++loop){
cout << "Input NO." << loop + 1<<": "; //显示是第几次输入
cin >> user_input; //用户输入元素
S.push(user_input); //将该元素入栈
}
S.print(); //调用成员函数打印链栈中的元素
//自顶向底遍历并打印链栈中的元素
for (loop = 0; loop != max_input; ++loop){
cout<<S.get_top()<<" "; //打印当前栈顶元素
S.pop(); //将当前栈顶元素出栈
}
system("pause");
}
从运行结果可以看出,栈是符合后进先出(LIFO)原则的。