[数据结构] 栈和队列C++作业

1 . 对于栈操作数据的原则是( )。

A.先进先出

B.后进先出

C.后进后出

D.不分顺序

解析

栈操作数据的原则是先进后出或后进先出。

2 . 栈的“先进后出”特性是指( )。

A.最后进栈的元素总是最先出栈

B.当同时进行进栈和出栈操作时,总是进栈优先

C.每当有出栈操作时,总要先进行一次进栈操作

D.每次出栈的元素总是最先进栈的元素

3 . 给定一个空栈,若元素10、20、23、13依次进栈,然后有两个数出栈,又有3个数进栈,第一次进栈的元素23现在( )。

A.已出栈

B.从栈底算起第3个

C.处于栈顶

D.从栈底算起第4个

解析

本题的操作是:元素10、20、23、13依次进栈,然后出栈13和23,再进栈3个元素,第一次进栈的元素23已出栈了。

4 . 给定一个足够大的空栈,有4个元素的进栈次序为A、B、C、D,则以C、D开头的出栈序列的个数为 ( )。

A.1        B.2        C.3        D.4

解析

若出栈序列为CD…,则A、B、C进栈,C出栈,D进栈,D出栈,此后只有B出栈和A出栈一种情况,所以这样的出栈序列只有CDBA一个。

5 . 若元素a、b、c、d、e、f依次进栈,允许进栈、退栈的操作交替进行,但不允许连续3次退栈工作,则不可能得到的出栈序列是( )。

A.dcebfa

B.cbdaef

C.bcaefd

D.afedcb

解析

选项A操作:a进,b进,c进,d进,d出,c出,e进,e出,b出,f进,f出,a出。 选项B操作:a进,b进,c进,c出,b出,d进,d出,a出,e进,e出,f进,f出。 选项C操作:a进,b进,b出,c进,c出,a出,d进,e进,e出,f进,f出,d出。 选项D操作:a进,a出,b进,c进,d进,e进,f进,f出,e出,d出,c出,b出。 从中看到,选项D中最后连续出栈5次,不符合要求。本题答案为D。

6 . 设一个栈的输入序列为A、B、C、D,则借助一个栈所得到的输出序列不可能是( )。

A.A,B,C,D

B.D,C,B,A

C.A,C,D,B

D.D,A,B,C

解析

可以简单地推算,容易得出D,A,B,C是不可能的,因为D先出来,说明A,B,C,D均在栈中,在栈中顺序应为D,C,B,A,出栈的顺序只能是D,C,B,A,如图3.3所示。所以本题答案为D。

7 . 设栈的输入序列是1、2、3、4,则( )不可能是其出栈序列。

A.1、2、4、3

B.2、1、3、4

C.4、3、1、2,

D.3、2、1、4

解析

当出栈序列的第一个元素为4时,只有唯一的出栈序列4、3、2、1,不可能有4、3、1、2的出栈序列。本题答案为C。

8 . 队列和栈具有相同的( )。

A.抽象数据类型

B.逻辑结构

C.存储结构

D.运算

解析

队列和栈中元素之间的逻辑关系均为线性关系。

9 . 栈和队列的共同点是( )。

A.都是先进后出

B.都是后进先出

C.只允许在端点处插入和删除元素

D.没有共同点

解析

栈和队列的共同点是,数据元素的逻辑关系都是线性关系,都只能在端点进行插入和删除操作。

10 . 栈和队列的不同点是( )。

A.都是线性表

B.都不是线性表

C.栈只能在一端进行插入删除操作,而队列在不同端进行插入删除操作

D.没有不同点

解析

栈和队列的不同点是,栈在同一端进行插入和删除操作,而队列在不同端进行插入和删除操作。本题答案为C。

11 . 在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,这样主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印。该缓冲区应该是一个( )结构。

A.

B.队列

C.数组

D.线性表

解析

打印数据缓冲区具有先来先打印的特点,队列正好满足这个特点,本题答案为B。

12 . 在数据处理过程中常需要保存一些中间数据,如果先保存的数据先处理,则使用( )来保存这些数据。

A.线性表

B.

C.队列

D.单链表

解析

由于先保存的数据先处理,队列正好满足这个特点,本题答案为C。

13 . 以下( )属于队列的基本运算。

A.对队列中的元素排序

B.取出最近进队的元素

C.在队头元素之前插入元素

D.删除队头元素

解析

删除队头元素即为出队,是队列的基本运算之一。

14 . 经过以下队列运算后,队头的元素是( )。 InitQueue(qu);EnQueue(qu,a);EnQueue(qu,b);EnQueue(qu,c);DeQueue(qu);

A.a

B.b

C.1

D.0

解析

在队列qu初始化后,进队a、b、c,出队a,所以队头为b。

15 . 经过以下队列运算后,QueueEmpty(qu)的值是( )。 InitQueue(qu);EnQueue(qu,a);EnQueue(qu,b);DeQueue(qu,x);DeQueue(qu,y);

A.a

B.b

C.true

D.false

解析

在队列qu初始化后,进队a、b,出队两次,队为空,QueueEmpty(qu)返回true。

16 . 一个队列的入列序列为1234,则出队序列是( )。

A.4321

B.1234

C.1432

D.3241

解析

进队序列为1234,出队序列只能是1234。

17 . 一个栈的输入序列为1,2,3,…,n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是( )。

A.不确定

B.n-i+1

C.i

D.n-i

18 . 设abcdef以所给的次序进栈,若在进栈操作时,允许退栈操作,则下面得不到的序列为( )。

A.fedcba

B.bcafed

C.dcefba

D.cabdef

19 . 若一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是( )。

A.top:=top+1; V [top]:=x

B.V [top]:=x; top:=top+1

C.top:=top-1; V [top]:=x

D.V [top]:=x; top:=top-1

20 . 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( )。

A.|top[2]-top[1]|=0

B.top[1]+1=top[2]

C.top[1]+top[2]=m

D.top[1]=top[2]

21 . 栈在( )中应用。

A.递归调用

B.子程序调用

C.表达式求值

D.A,B,C

22 . 一个递归算法必须包括( )。

A.递归部分

B.终止条件和递归部分

C.迭代部分

D.终止条件和迭代部分

23 . 执行完下列语句段后,i值为:( ) int f(int x) { return ((x>0) ? x* f(x-1):2);} int i ; i =f(f(1));

A.2

B.4

C.8

D.无限递归

24 . 设计一个判别表达式中左,右括号是否配对出现的算法,采用( )数据结构最佳。

A.线性表的顺序存储结构

B.队列

C.线性表的链式存储结构

D.

25 . 用链接方式存储的队列,在进行删除运算时( )。

A.仅修改头指针

B.仅修改尾指针

C.头、尾指针都要修改

D.头、尾指针可能都要修改

 回答错误

解析:在有头结点的链队列的出队操作中,一般只需修改队头指针,但当原队列中只有一个结点时,该结点既是队头也是队尾,故删去此结点时亦需修改队尾指针,使其指向头结点,且删去此结点后队列变空。所以选D。

26 . 递归过程或函数调用时,处理参数及返回地址,要用一种称为( )的数据结构。

A.队列

B.多维数组

C.

D.线性表

27 . 假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( )。

A.(rear-front+m)%m

B.rear-front+1

C.(front-rear+m)%m

D.(rear-front)%m

28 . 循环队列存储在数组A[0..m]中,则入队时的操作为( )。

A.rear=rear+1

B.rear=(rear+1) mod (m-1)

C.rear=(rear+1) mod m

D.rear=(rear+1)mod(m+1)

 回答错误

解析:此时下标为[0..m],有m+1个元素。循环队列,头指针font,尾指针rear,再数组中增加一个元素,尾指针加1,想要达到循环的效果,就让rear+1对整个队列空间(m+1)取余即可,将数再次放入这个队列中。所以选D。

29 . 若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( )

A.1和 5

B.2和4

C.4和2

D.5和1

30 . 最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是 ( )。

A.(rear+1) MOD n=front

B.rear=front

C.rear+1=front

D.(rear-l) MOD n=front

31 . 栈和队列的共同点是( )。

A.都是先进先出

B.都是先进后出

C.只允许在端点处插入和删除元素

D.没有共同点

32 . 栈和队都是( )

A.顺序存储的线性结构

B.链式存储的非线性结构

C.限制存取点的线性结构

D.限制存取点的非线性结构

33 . 设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是( )。

A.6

B.4

C.3

D.2

34 . 用单链表表示的链式队列的队头在链表的( )位置。

A.链头

B.链尾

C.链中

 回答错误

解析:队头插入,队尾删除。 所以队头对应链表的表头,队尾对应链表的表尾。正确答案选A。

35 . 

括号匹配

输入一串包含大、中、小括号的字符串,输出括号是否匹配。

学生答案

#include <iostream>#include <cstring>#include <stack>using namespace std;bool mystack(char left, char right) {

    return (left == '{' && right == '}') || (left == '[' && right == ']') || (left == '(' && right == ')');

}

bool match(char str[]) {

    stack<char> s;

    for (int i = 0; i < strlen(str); i++) {

        if (str[i] == '{' || str[i] == '[' || str[i] == '(') {

            s.push(str[i]);

        } else if (str[i] == '}' || str[i] == ']' || str[i] == ')') {

            if (s.empty() || !mystack(s.top(), str[i]))

                return false;

            s.pop();

        }

    }return s.empty();

}

int main() {

    char str[100];

    cin.getline(str, 100);

    cout << (match(str) ? "true" : "false");

    return 0;

}

答案

#include <iostream>#include <cstring>using namespace std;char stack[100];int top=0;bool flag=true;bool match(char str[]){

    for(int i=0;i<strlen(str);i++){

        switch(str[i]){

            case '[':

            case '(':

            case '{':

                stack[top++]=str[i];

                break;

            case ')':

                if(top>0&&stack[top-1]=='(')

                    top--;

                else

                    flag=false;

                break;

            case ']':

                if(top>0&&stack[top-1]=='[')

                    top--;

                else

                    flag=false;

                break;

            case '}':

                if(top>0&&stack[top-1]=='{')

                    top--;

                else

                    flag=false;

                break;

        }

    }

    if(top==0&&flag)

        return true;

    else

        return false;

}int main(){

    char str[100];

    cin.getline(str,100);

    cout<<(match(str)?"true":"false");

    return 0;

}


 

  • 46
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值