day06:栈&队列&优先队列
栈:限定只在表尾进行删除插入操作的线性表。
也就是后进先出(LIFO-last in first out):最后插入的元素最先出来。
把允许删除的一端称为栈顶(Top),另一端称为栈底(Bottom).不含任何数据元素的栈称为空栈。
栈的插入操作,叫作进栈,栈的删除操叫做出栈。
#include<iostream>
#include<stack>
using namespace std;
stack <int> stk;//定义
/* stack <int> stk; //定义
stk.push(i); //入栈
int num = stk.size(); //返回栈内元素的大小
bool flag = stk.empty();//如果栈为空返回true,否则返回false
int x = stk.top(); //返回栈顶,但不删除成员
stk.pop(); //从栈顶弹出一个成员 */
int main(){
for(int i=0; i<10; i++) stk.push(i); //入栈
cout<<"栈的大小"<<stk.size()<<endl;//返回栈内元素的大小
cout<<"栈内元素:";
while(!stk.empty()){ //如果栈为空返回true,否则返回false
cout<<stk.top()<<" "; //返回栈顶,但不删除成员
stk.pop(); //从栈顶弹出一个成员
}cout<<endl;
cout<<"栈的大小:"<<stk.size()<<endl;
return 0;
}
//运行结果
栈的大小:10
栈内元素:9 8 7 6 5 4 3 2 1 0
栈的大小:0
队列(Queue):是只允许在一端进行插入操作,在另一端进行删除操作的线性表。
(在队尾插入数据,队头删除数据)
也就是先进先出(FIFO-first in first out):最先插入的元素最先出来。
循环队列:队列的头尾相接的顺序存储结构称为循环队列。
#include<iostream>
#include<queue>
using namespace std;
queue<int> que; //定义
/* queue<int> que; //定义
que.push(i); //入队列
int num = que.size(); //返回队列内元素的个数
bool flag = que.empty();//如果队列为空返回true,否则返回false
int x = que.front(); //返回队首元素
int y = que.back(); //返回队尾元素
que.pop(); //从队首弹出一个成员*/
int main() {
for(int i=0; i<10; i++) que.push(i); //入队
cout<<"队列的大小:"<<que.size()<<endl;//返回队列内元素的个数
cout<<"队首元素:"<<que.front()<<endl;//队首元素
cout<<"队尾元素:"<<que.back()<<endl; //队尾元素
cout<<"队列元素:";
while(!que.empty()){
cout<<que.front()<<" ";
que.pop(); //从队首弹出一个成员
} cout<<endl;
cout<<"队列的大小:"<<que.size()<<endl;//返回队列内元素的个数
return 0;
}
//运行结果
队列的大小:10
队首元素:0
队尾元素:9
队列元素:0 1 2 3 4 5 6 7 8 9
队列的大小:0
优先队列:队列中的元素被赋予优先级,当访问元素时,具有最高优先级的元素最先删除。
优先队列具有*先出 (first in, largest out)的行为特征
优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
//升序队列,小顶堆
priority_queue <int,vector<int>,greater<int> > q;
//降序队列,大顶堆
priority_queue <int,vector<int>,less<int> >q;
//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)