栈和队列 - 习题

  • 己知循环队列存储在一维数组 A[0 … n-1] 中,且队列非空时 front 和 rear 分别指向队头元素和队尾元素。若初始时队列为空,且要求第 1 个进入队列的元素存储在 A[0] 处,则初始时 front 和 rear 的值分别是 ( )

A. 0, 0            B. 0, n-1            C. n-1, 0            D. n-1, n-1

解:

  • 一般情况下 rear 指针指向队尾元素的下一位,但该题给出限制 front 和 rear 指针分别指向队头元素和队尾元素。则插入元素时,向 rear 指针所指区域下一位插入,当 rear 指向 n-1 时,元素在 0 位置插入,此时若 front 指针指向 0 位置则满足条件“front 和 rear 分别指向队头元素和队尾元素”,故选 B

  • 假设栈初始为空,将中缀表达式 a/b+(cd-ef)/g 转化为等价的后缀表达式的过程中,当扫描到 f 时,栈中的元素依次是 ( )

A. +(-            B. +(-            C. /+(-            D. /+-*

解:

  • 遇到除数字外的字符则进栈。若栈中 top 的运算符优先级比将要进栈的运算符高,则将高优先级运算符弹出并把低优先级运算符压入栈;若将要进栈的运算符优先级和 top 运算符优先级一样,则把将要进栈的运算符弹出,故选 B

  • 若一个栈以向量 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

解:

  • 栈式运算受限的线性表,只允许在栈顶进行插入和删除操作。本题中栈顶指针为 n+1,该数组将栈顶放在了下标大的一端,所以在进行入栈操作时 top 指针应该进行减 1 操作。通常元素进栈的操作为:先移动栈顶指针后存入元素。故选 C

  • 多个栈共存时,最好用 作为存储结构

解:链式存储结构

  • 顺序栈用 data[1...n] 存储数据,栈顶指针是 top,则值为 x 的元素入栈的操作是

解:if (top != n) data[++top] = x;

  • 已知链队列的头尾指针分别是 f 和 r,则将值 x 入队的操作序列是

解:new(s); s->data = x; s->next = r->next; r->next = s; r = s;

  • 下面程序的功能是用递归算法将一个整数按逆序存放到一个字符数组中。如123存放成321。请填空:
#include <stdio.h>

void convert(char *a, int n)
{
    int i;
    if (i = n / 10)
        convert(_____, i);
    *a = _____;
}

main()
{
    int number;
    char str[10] = " ";
    scanf("%d", &number);
    convert(str, number);
    puts(str);
}

解:
char *a 即开辟一块内存,将字符串首地址存到指针 a 中

  • a + 1            // 递归整除 10 并逐个向后移动指针
  • '0' + n % 10     // 达到递归边界后在归的过程中将每步除余得到的数替换当前指针所指的数,加上'0'即将数字字符变为字符串
posted @ 2021-11-06 20:15  絵守辛玥  阅读(155)  评论(0)    收藏  举报