链栈

//共三个文件,分别为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)原则的。

这里写图片描述

posted @ 2016-06-29 00:00  larryking  阅读(398)  评论(1编辑  收藏  举报