数据结构 - 堆栈

Data Structures - Stack

ZingLix March 26, 2017

基本概念

堆栈(stack)是一种特殊的线性数据结构,只能够在一端(即栈顶)进行,采用后进先出原则(LIFO, Last In First Out),基本操作有加入数据(push)和输出数据(pop)两种运算。

原型声明

除了构造和析构函数外,根据定义,最主要的即为Pop和Push两个操作,在此基础上加上返回栈顶元素(Top),判断是否为空栈(IsEmpty)和将栈置空(MakeEmpty)三个功能。 在本文中,每个栈都有一个表头,不记录数据,只用来记录栈顶位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Node
{
    int dat;
    Node *Next;
};

class Stack {
public:
    Stack();
    Stack(int i);
    int IsEmpty();
    void MakeEmpty();
    void Push(int x);
    int Top();
    void Pop();
    ~Stack();

private:
    Node *node;
};

压入数据 Push

整体思路为新申请一个节点,用于存储新数据,使其指向原栈顶元素,再将表头指向新元素即可。

1
2
3
4
5
6
7
void Stack::Push(int x)
{
    Node *tmp = new Node;
    tmp->dat = x;
    tmp->Next = node->Next;
    node->Next = tmp;
}

弹出数据 Pop

只需将栈顶元素删除,然后将表头指向原栈顶元素所指向的结点即可。在这要注意用一个新变量先记录栈顶元素否则会导致无法释放空间。而且要防止空栈的情况发生。

1
2
3
4
5
6
7
8
void Stack::Pop()
{
    if (!this->IsEmpty()) {
        Node *tmp = node->Next;
        node->Next = node->Next->Next;
        delete tmp;
    }
}

返回栈顶元素 Top

返回表头所指结点数据即可。这里INF为一个不可能被使用到的数据,以用来提示空栈的情况。

1
2
3
4
5
6
7
8
int Stack::Top()
{
    if(!this->IsEmpty()){
        return node->Next->dat;
    }else{
        return INF;
    }
}

判断是否为空栈 IsEmpty

判断表头是否为空指针即可。

1
2
3
4
5
6
7
8
int Stack::IsEmpty()
{
    if (node->Next == nullptr) {
        return 1;
    }else{
        return 0;
    }
}

将栈置空 MakeEmpty

将元素不断弹出直至栈为空即可。

1
2
3
4
void Stack::MakeEmpty()
{
    while (!this->IsEmpty()) this->Pop();
}