栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操 作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。不含任 何元素的栈称为空栈,栈又称为后进先出的线性表
链式栈与顺序栈相比有很多优点。当栈需要动态变化时,如果使用顺序栈,如果设置过大会造成很多的资源浪费;如果过小,当栈溢出时,需要开辟一块更大的空间同时将原来栈中的元素全部拷贝过去,造成较大的时间开销。相反,用链接表示可以动态扩充栈的大小;而且可以节约内存空间。
栈特性:后进先出(LILO)特殊线性表
栈功能:将数据从一种序列改变到另一种序列
顺序栈的出栈和进栈只能对栈顶数据进行操作
顺序栈的所有操作时间复杂度都是O(1);
下面就是对于顺序栈的代码操作:
#include<iostream>
using namespace std;
#define STACK_SIZE 10
template<class T>
class stack
{
public:
stack()
:_size(0)
{}
void push(const T&data)
{
if (_size == STACK_SIZE)
return;
_array[_size++] = data;
}
void pop()
{
--_size();
}
T&Top()
{
return _array[_size - 1];
}
const T&Top()const
{
return _array[_size - 1];
}
size_t Size()const
{
return _size;
}
bool Empty()const
{
return 0 == _size;
}
private:
T _array[STACK_SIZE];
int _size;
};
int main()
{
stack<int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
cout << s.Size() << endl;
cout << s.Top() << endl;
}
当然链式栈是一种基于链表的存储表示
下面就是链式栈的实现及测试代码:
#include<iostream>
using namespace std;
template<class T>
class LinkNode
{
public:
T _data;
LinkNode *Link;
LinkNode(const T& args, LinkNode<T> *ptr = nullptr)
{
_data = args;
Link = ptr;
}
};
template <class T>
class LinkStack
{
LinkNode<T>*top;
public:
LinkStack()
{
top = nullptr;
}
~LinkStack()
{
makeEmpty();
}
void push(const T&data)
{
top = new LinkNode<T>(data, top);
}
bool pop(T&x)
{
if (isEmpty())
return false;
LinkNode<T>*p = top;
top = top->Link;
x = p->_data;
delete p;
}
bool getTop(T&x)const
{
if (isEmpty())
return false;
x = top->_data;
return true;
}
bool isEmpty()const
{
return (top == nullptr) ? true : false;
}
int GetSize()const
{
LinkNode<T> *p = top;
int k = 0;
while (p != nullptr)
{
p = p->Link;
++k;
}
return k;
}
void makeEmpty()
{
LinkNode<T>*p;
while (top != nullptr)
{
p = top;
p = p->Link;
delete p;
}
}
};
void menu() {
cout << "1.进栈" << endl;
cout << "2.出栈" << endl;
cout << "3.获取栈顶元素" << endl;
cout << "4.栈置空" << endl;
cout << "5.退出" << endl;
}
template<class T>
void function(int num, LinkStack<T> *ls) {
switch (num) {
int x;
case 1:
cin >> x;
ls->push(x);
break;
case 2:
ls->pop(x);
break;
case 3:
ls->getTop(x);
cout << x << endl;
break;
case 4:
ls->makeEmpty();
break;
case 5:
exit(1);
break;
}
}
int main(int argc, char** argv) {
LinkStack<int> *ls = new LinkStack<int>;
int num;
while (true) {
menu();
cin >> num;
function(num, ls);
}
delete ls;
return 0;
}