• C++
  • 备战CSP-J初赛21天打卡计划。DAY6-栈和队列2

  • @ 2024-9-4 14:10:42

队列

队列是先进先出(FIFO,First-In-First-Out)的线性表。队列只允许在后端(称为back,rear,tail)进行插入操作,在前端(称为front,head)进行删除操作。

队列的操作

入队:在队尾(称为back)进行插入或添加操作;

出队:在队头(称为front)进行删除操作。

数组模拟队列

int q[SIZE], front = 1, back = 0;	//定义队列q,队头与队尾
q[++back] = x;			//队尾插入元素
front++;				//队头删除元素
cout << q[front];		//访问队头
cout << q[back];		//访问队尾
front = 1, back = 0;	//清空队列

STL中的队列

STL 中的 queue 容器提供了一众成员函数以供调用。其中较为常用的有:

  • 元素访问
    • q.front() 返回队首元素
    • q.back() 返回队尾元素
  • 修改
    • q.push() 在队尾插入元素
    • q.pop() 弹出队首元素
  • 容量
    • q.empty() 队列是否为空,若为空则返回true,否则返回false
    • q.size() 返回队列中元素的数量

此外,queue 还提供了一些运算符。较为常用的是使用赋值运算符 =queue 赋值,示例:

#include<queue>						//使用queue需要对应的头文件
queue<int> q1, q2;					//新建两个队列q1,q2
q1.push(1);							//q1入队1
q2 = q1;							//queue可以进行整体赋值,将q1赋值给q2
cout << q1.front();					//输出q1队头,仅有一个元素1,输出为1
cout << q2.back();					//输出q2队尾,仅有一个元素1,输出为1
q1.pop();							//q1出队
if(!q2.empty) cout << q2.size();	//如果q2不为空,输出q2元素数量,仅有一个元素,输出为1

填空题

队列快照是指在某一时刻队列中的元素组成的有序序列。例如,当元素1、2、3入队,元素1出队后,此刻的队列快照是"2 3"。当元素2、3也出队后,队列快照是"",即为空。现有3个正整数元素依次入队、出队。已知它们的和为8,则共有_________种可能的不同的队列快照(不同队列的相同快照只计一次)。例如,"5 2 1"、"4 2 2"、""都是可能的队列快照;而"7"不是可能的队列快照,因为剩下的2个正整数的和不可能是1。

1 条评论

  • @ 2024-9-4 14:13:43

    答案:49。先有序枚举3个正整数可能的组合(1,1,6)(1,2,5)(1,3,4)(2,2,4)(2,3,3)。 先有序枚举3个正整数可能的组合(1,1,6)(1,2,5)(1,3,4)(2,2,4)(2,3,3)。分成两类:其中一类包含两个相同的数字,(1,1,6)(2,2,4)(2,3,3)每个可以形成8种队列快照,以(1,1,6)为例,(1)(6)(1,1)(1,6)(6,1)(1,1,6)(1,6,1)(6,1,1); 另一类三个数字互不相同,(1,2,5)和(1,3,4)每个可以行程15种队列快照,以(1,2,5)为例(1)(2)(5)(1,2)(2,1)(1,5)(5,1)(2,5)(5,2)(1,2,5)(1,5,2)(2,1,5)(2,5,1)(5,2,1)(5,1,2)。 那么一共有3×8+2×15=54种,但是存在重复和遗漏。 重复:单个数字的快照(1)重复了2次,(2)重复了2次, (3)重复了1次,(4)重复了1次,去掉重复后剩54−2−2−1−1=48种; 遗漏:遗漏了空的快照,加上后有48+1=49种; 一共有49种可能的不同的队列快照。

    • 1