栈 —— 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;
}