栈的概念及结构
数据结构中的栈,是一种特殊的线性表,它只允许对其固定的一端进行元素的插入和删除操作。可以进行操作的固定端叫做栈顶,与之相反的另一端叫做栈底。由于元素的增删只能从栈顶操作,所以自然而然的满足了后进先出的原则,即Last In First Out。
两个名词
(1)压栈:栈的插入,入数据在栈顶
(2)出栈:栈的删除,出数据也在栈顶
栈的快速实现
栈是一种特殊的线性表,因此既可以使用顺序表实现,也可以使用链表实现。但综合来看,使用顺序表实现更优,因为使用顺序表进行尾插和尾删时效率更高(针对非双向循环链表),且缓存利用率也更高。
首先在头文件中声明好栈的结构:
#pragma once
#include <assert.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef int STDataType;
typedef class Stack
{
public:
Stack();//构造函数
~Stack();//析构函数
void Push(STDataType x);//压栈
void Pop();//出栈
STDataType Top();//取顶元素
int Size();//元素个数
bool IsEmpty();//判空
private:
STDataType* _a;
int _top;
int _capacity;
}ST;
其中成员变量_a指向顺序表的首地址,_top为栈顶的下标,_capacity为顺序表的容量。
接下来是成员函数的实现:
构造函数
Stack::Stack()
{
_a = nullptr;
_top = -1;
_capacity = 0;
}
析构函数
Stack::~Stack()
{
free(_a);
_a = nullptr;
}
压栈
void Stack::Push(STDataType x)
{
if (_capacity == _top + 1)//需要扩容
{
int newCapacity = _capacity == 0 ? 4 : 2 * _capacity;
STDataType* tmp = (STDataType*)realloc(_a, sizeof(STDataType) * newCapacity);
if (tmp == nullptr)
{
cout << "realloc fail" << endl;
exit(-1);
}
_a = tmp;
_capacity = newCapacity;
}
_a[_top + 1] = x;
++_top;
}
出栈
void Stack::Pop()
{
assert(!IsEmpty());
--_top;
}
取栈顶元素
STDataType Stack::Top()
{
assert(!IsEmpty());
return _a[_top];
}
求元素个数
bool Stack::IsEmpty()
{
return _top == -1;
}
判断顺序表是否为空
int Stack::Size()
{
return _top + 1;
}