第2章 算法知识、栈、队列--2

时间:2024-09-13 14:20:53 分类:信息学

3、队列操作的代码实现

#include <iostream>

#define MAXN 5

using namespace std;

//队列

int queue[MAXN] = {0}; //头指针

int front = 0; //尾指针

int rear = 0;

//入队

void addqueue(int value){

if(rear >= MAXN){

cout<<"队满!"<<endl; }else{

queue[rear] = value; rear++;

 }

}

//出队

int delqueue(){

 int r;

if(front == rear){

 cout<<"队空"<<endl;

 r = -1;

}else{

r = queue[front];

front++;

}

return r; }

//显示队

void display(){

int i;

for(i = front;i < rear;i++){

cout<<queue[i]<<" "; } cout<<endl;

}

int main(){

int order;//口令 int value,t; cout<<"输入指令"<<endl; while(1 == 1){

cout<<"1入队,2出队,3显示!"<<endl; cin>>order; if(order == 1){

 cin>>value;

addqueue(value);

display();

}else if(order == 2){

 t = delqueue();

 if(t != -1){

cout<<t<<"已经出队"<<endl; display();

}else{

cout<<"队列已空"<<endl; }

}else if(order == 3){

 display();

}else{

cout<<"口令错误!"<<endl; }

} }

10     20    30

0        1      2     3     4

front=-1     rear=2

4、循环队列的使用

上述通过数组来实现队列的方法,如果进行插入一次,删除一次的操作,只要数组使用

过一遍数组就会被用光。当数组仿真队列的元素全部出队以后,队的首部就会出现需多空位

无法使用,导致空间浪费。

解决方法:

将线型数组模拟成环形数组。但无论在线型数组中还是环形数组中,都有一个问题:无

法判断队空还是队满;

因为队空的条件是:

front==rear;

队满的条件也是:

front==rear;

为了解决这个问题,我们在入队时少用一个数据元素空间

这样,判断队满的方式为:(rear + 1) % MAXN == front

判断队空的方式为:rear == front

循环队列求队列元素个数:(rear-front+n)%n

#include <iostream>

#define MAXN 5

using namespace std;

//队列

int queue[MAXN] = {0}; //头指针

int front = 0; //尾指针

int rear = 0;

//入队

void addqueue(int value){

//元素从未出队的情况下,队满

if(front == 0 && (rear + 1) % MAXN == front){

cout<<"队满"<<endl; //有元素出队,队满

}else if((rear + 1) % MAXN == front){

cout<<"队满"<<endl; }else{

queue[rear] = value;

 rear = (rear + 1) % MAXN;

}

}

//出队

int delqueue(){

 int r;

if(front == rear){

 cout<<"队空"<<endl;

 r = -1;

}else{

 r = queue[front];

 queue[front] = -1;//出队标记

 front = (front + 1) % MAXN;

}

return r; }

//显示队

void display(){

 if(front == rear){

 cout<<"队空"<<endl;

 }else{

int i = front;

do{

 cout<<queue[i]<<" ";

 i = (i + 1) % MAXN;

 }while(i != rear);

}

 cout<<endl;

}

int main(){

int order;//口令 int value,t; cout<<"输入指令"<<endl; while(1 == 1){

cout<<"1入队,2出队,3显示!"<<endl; cin>>order; if(order == 1){

 cin>>value;

addqueue(value);

display();

}else if(order == 2){

 t = delqueue();

 if(t != -1){

cout<<t<<"已经出队"<<endl; display();

}else{

cout<<"队列已空"<<endl; }

}else if(order == 3){

 display();

}else{

cout<<"口令错误!"<<endl; }

} }

【noip2012 普及组】2.( )是一种先进先出的线性表。

A.栈 B.队列 C.哈希表(散列表) D.二叉树

答案:B

【noip2011普及组】11.广度优先搜索时,需要用到的数据结构是( )。

A.链表 B.队列 C.栈 D.散列表

答案:B

2.5 栈练习题

1、若已知一个栈的入栈顺序是 1,2,3,…,n,其输出(出栈)序列为 P1,P2,P3,…,

Pn,若 P1 n,则 Pi 是( )。

A)i B)n-1 C)n-i+1 D)不确定

2、以下哪一个不是栈的基本运算( )。

A)删除栈顶元素 B)删除栈底的元素

C)判断栈是否为空 D)将栈置为空栈

3、设栈 S 的初始状态为空,现有 5 个元素组成的序列{1,2,3,4,5},对该序列在 S 栈上

依次进行如下操作(从序列中的 1 开始,出栈后不再进栈):进栈,进栈,进栈,出栈,进栈,出

栈,进栈,问出栈的元素序列是:_________,栈中元素个数______,栈顶元素为:______。

4、已知元素(8,25,14,87,51,90,6,19,20),问这些元素以怎样的顺序进入栈,

才能使出栈的顺序满足:8 51 前面;90 87 的后面;20 14 的后面;25 6 的前面;

19 90 的后面。( )。

A 20,6,8,51,90,25,14,19,87

B 51,6,19,20,14,8,87,90,25

C 19,20,90,8,6,25,51,14,87

D 6,25,51,8,20,19,90,87,14

E 25,6,8,51,87,90,19,14,20

5、[多选]设栈 S 的初始状态为空,元素 a, b, c, d, e, f, g 依次入栈,以下出栈序

列不可能出现的有

)。

A. a, b, c, e, d, f, g

B. b, c, a, f, e, g, d

C. a, e, c, b, d, f, g

D. d, c, f, e, b, a, g

E. g, e, f, d, c, b, a

6、某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口(出入同一口)。已

知某时刻该车站状态为空,从这一时刻开始的出入记录为:“进,出,进,进,进,出,出,

进,进,进,出,出”。假设车辆入站的顺序为 1,2,3,……,则车辆出站的顺序为( )。

A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7 C. 1, 4, 3, 7, 6

D. 1, 4, 3, 7, 2 E. 1, 4, 3, 7, 5

7、设栈 S 的初始状态为空,元素 a, b, c, d, e 依次入栈,以下出栈序列不可能出现

的有( )。

A. a, b, c, e, d B. b, c, a, e, d

C. a, e, c, b, d D. d, c, e, b, a

8、设栈 S 的初始状态为空,元素 a,b,c,d,e,f 依次入栈 S,出栈的序列为 b,d,

c,f,e,a,则栈 S 的容量至少应该是( )。

A. 6 B. 5 C. 4 D. 3 E. 2

9、设有一顺序栈 S,元素 s1,s2,s3,s4,s5,s6 依次进栈,如果有 6 个元素出栈的顺序

s2,s3,s6,s5,s4,s1,则栈的容量至少是( )。

A、2 B、3 C、4 D、5

10、设有一顺序栈已含 3 个元素,如下图所示,元素 a4 正等待进栈。那么下列 4 个序

列中不可能出现的出栈序列是( )。

0 1 2 3

a1 a2 a3

top

A、a3,a1,a4,a2 B、a3,a2,a4,a1

C、a3,a4,a2,a1 D、a4,a3,a2,a1

11、若一个栈的输入序列为 1,2,3,….n,输出序列的第一个元素是 i,则第 j 个输出元

素是( )。

A、i j 1 B、i-j C、j-i+1 D、不确定

12、设一个站的输入序列是 1,2,3,4,5,则下列序列中,是栈的合法输出序列的是( )。

A、5,1,2,3,4 B、4,5,1,3,2 C、4,3,1,2,5 D、3,2,1,5,4

参考答案:

1.C 2.B 3.出栈序列为{3,4},栈顶指针值为 3,栈顶元素为 5。 4.D 5.CE

6.C 7.C 8.D 9.C 10.A

11.D 12.D