走进数据结构和算法(c++版)(4)——栈

  栈的应用十分的普遍,比如我们按浏览器的后退键,就会逆序加载我们浏览过的网页;一些应用软件中的撤销操作也是应用了栈的方式。

栈( stack )是限定仅在表尾进行插入和删除操作的线性表。

1

  结合上图,我们对栈及其的操作进一步解释。允许插入和删除的一端称为栈顶 ( top),另一端称为栈底 ( bottom) ,不含任何数据元素的栈称为空栈。栈是后进先出 ( Last In First Out) 的线性表,简称 LlFO 结构。栈的插入操作,叫作进栈,也称压栈入栈。栈的删除操作,叫作出栈,也有的叫作弹栈

栈的顺序存储结构

  栈是线性表的特例,因此栈也可以用数组来实现。我们把数组下标为0的一端作为栈底。我们来看下它的代码定义:

#define MAXSIZE 30
class Stack
{
public:
    Stack();
    ~Stack();
    bool push(int val);//进栈
    void traverse();//历遍
    bool pop(int& val);//出栈
    bool is_empty();//判断是否为空
    bool is_full();//判断是否为满
private:
    int top;//栈顶
    int data[MAXSIZE];//栈底为data[0]
};

  栈的操作的具体代码实现:

#include "Stack.h"
#include<iostream>

using namespace std;

Stack::Stack():top(-1)//注意初始化top=-1
{
}


Stack::~Stack()
{
}

bool Stack::push(int val)//进栈
{
    if (is_full())return false;
    top++;
    data[top] = val;
    return true;
}
bool Stack::pop(int& val)//出栈
{
    if (is_empty())return false;
    val = data[top--];
    return false;
}
void  Stack::traverse()//历遍
{
    int p = top;
    while (-1!=p)
    {
        cout << data[p--] << " ";
    }
    cout << endl;
}
bool  Stack::is_full()//判断是否为满
{
    return MAXSIZE - 1 == top ? true : false;
}
bool Stack::is_empty()//判断是否为空
{
    return  - 1 == top ? true : false;
}

  这里要注意的是top的初始值为-1,当存在有一个数据元素时,top=0。当进栈时要先将top++,再赋值。

#include<iostream>
#include "Stack.h"
using namespace std;

int main()
{
    Stack s;
    int val;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
    s.traverse();
    s.pop(val);
    cout << "出栈的值为:" << val << endl;
    s.traverse();
    system("pause");
    return 0;
}

  在VS上运行结果如下:

2

栈的链式存储结构

  下面我们再来看下栈的链式存储结构,简称为链栈。为了节约内存空间,我们把链表的头指针和栈的栈顶合二为一。我们先建立结点的类。

class Node
{
public:
    Node();
    ~Node();
    friend class Stack;
private:
    int data;
    Node* pNext;
};

  再构建链栈:

#include "Node.h"
class Stack
{
public:
    Stack();
    ~Stack();
    void push(int val);//进栈
    void traverse();//历遍
    bool pop(int& val);//出栈
    bool empty();//判断是否为空
    void clear();//清空
private:
    Node *pTop;//栈顶
    Node *pBottom;//栈底
};

  栈的操作的具体代码实现:

#include "Stack.h"
#include "Node.h"
#include<iostream>
using namespace std;
Stack::Stack()
{
    pTop = new Node;
    pBottom = pTop;
    pTop->pNext = NULL;

}


Stack::~Stack()
{
}
void Stack::push(int val)
{
    Node * pNew = new Node;
    pNew->data = val;
    pNew->pNext = pTop;
    pTop= pNew;
}
void Stack::traverse()
{
    Node* p = pTop;
    while (p != pBottom)
    {
        cout << p->data << endl;
        p = p->pNext;
    }
}
bool Stack::pop(int& val)
{
    if (empty())return false;
    Node* r = pTop;
    val = r->data;
    pTop = pTop->pNext;
    delete r;
    return true;
}
bool Stack::empty()
{
    return pTop == pBottom ? true : false;
}
void Stack::clear()
{
    if (empty())return;
    Node *p = pTop;
    Node *q = NULL;
    while (p != pBottom)
    {
        q = p->pNext;
        delete p;
        p = q;
    }
    pTop = pBottom;
}

  出栈的时候要注意内存的释放。

#include<iostream>
#include "Stack.h"
#include "Node.h"
using namespace std;

int main()
{
    Stack s;
    int val;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
    s.traverse();
    s.pop(val);
    cout << "出栈的值为:" << val << endl;
    s.traverse();
    system("pause");
    return 0;
}

  在VS上运行结果如下:
3

栈的作用

  简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不放弃的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值