栈 —— stack

又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。

简单的说:采用该结构的集合,对元素的存取有如下的特点

先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。 栈的入口、出口的都是栈的顶端位置。

二、压栈 又称存元素,即把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。

三、弹栈 又称取元素,即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

栈的常用函数 ———————————————— push() —— 向栈顶增加一个元素 pop() —— 删除栈顶元素 top() —— 取出栈顶元素 size() —— 栈中元素的个数 empty() —— 判断栈是否为空 ————————————————

栈的优点

栈作为一种数据结构具有很多的优点:

1、实现简单:栈只需要两种基本操作,入栈和出栈就可以了。

2、易于操作:栈的操作比较直观,不需要复杂的算法。

3、占用空间小:栈只占用很小的内存空间,甚至可以使用栈实现递归调用。

4、在栈中查找元素很容易:栈顶的元素是最后一个入栈的元素,在查找时只需要从栈顶向下查找就可以了。

5、可以用栈实现递归调用:如果使用栈来实现递归调用,程序的效率会很高。

栈的缺陷

尽管栈方式有很多优点,但是它也存在一些缺陷。

1、栈的大小是固定的,不能动态改变。

2、栈的存储空间有限,所以不能存储大量的数据。

3、在栈中插入和删除元素需要频繁的移动数据,所以效率比较低。

栈的基本操作
#include <iostream>
#include <stack>
using  namespace std;

int main()
{
    stack<int> stk;//初始化
    stk.push(10); stk.push(20); stk.push(30);//插入元素
    stk.push(40); stk.push(50);
    
    cout << stk.size() << endl;//5
    cout << stk.top() << endl;//50
    stk.pop();
    cout << stk.size() << endl;//4
    cout << stk.top() << endl;//40
    
    while (!stk.empty())//如果栈不空
    {
        cout << stk.top() << " ";
        stk.pop();
    }
    return 0;
}

队列 —— queue

队列(queue)简称队,它也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入操作,而在表的另一端进行删除操作. 队列的常用函数 push() —— 向队尾增加一个元素 pop() —— 删除队头元素 front() —— 取出队头元素 back() —— 取出队头元素 队列的基本操作

#include <iostream>
#include <queue>

using namespace std;

int main()
{
    queue<int> q;
    q.push(10); q.push(20); q.push(30);//10 20 30
    
    cout << q.front() << " " << q.back() << endl;//10 30
    q.pop();//出队
    cout << q.front() << endl;//20
    return 0;
}