数据结构--栈、队列练习题

练习1:

​ 1.有五个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈序列中,以元素C、D最先出栈(即C第一个且D第二个出栈)的次序有哪些?

​ 2.铁路进行列车调度时,常把站台设计成栈式结构,试问:

​ (1) 设有编号为1,2,3,4,5,6的6辆列车,顺序开入栈式结构的站台,则可能的出栈序列有多少种?

​ (2)若进站的6辆列车顺序如上所述,那么是否能够得到435612、326541、154623和135426的出站序列?如果不能,说明为什么不能;如果能,说明如何得到(写出进栈或出栈的序列)。

​ 3.假设以I和O分别表示入栈和出栈操作。若栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,则称可以操作的序列为合法序列,否则称为非法序列。(提示:出入栈要合法,不能出现上溢、下溢情况)

​ (1)试指出判别给定序列是否合法的一般规则

​ (2)两个不同的合法序列(对两个具有同样元素的输入序列,如ABC和BAC)能否得到相同的输出元素序列?如能得到,请举例说明。

​ (3)写出一个算法,判定所给的操作序列是否合法。若合法,返回1,否则返回0(被判定的操作序列已存入一维char型数组ch[]中,操作序列以“\0”为结束符)(提示,使用循环遍历数组,依次得到I或O操作)

​ 作业要求:算法题使用如下的栈定义:

//具体数据类型根据题目要求,如第三题中的算法题,需要把int改为char
int a[100];
int top = -1;

//入栈操作,e为待入栈的值
a[++top] = e;
//出栈操作
e = a[top--];

练习2:

​ 1.回文字符串是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文字符串,但“good”不是回文字符串。试编写算法判断给定的字符串序列是否是回文字符串。(使用栈)

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define arraySize 100

//可以使用静态字符数组,或者动态字符数组
//1.静态数组,使用如下方式定义、遍历(#为结束标志)
char c[arraySize];
char ch;
int i;
printf("请输入一个字符串,以#为结束标志:");
scanf("%c", &ch);
for(i=0; ch != '#'; i++){
  c[i] = ch;
  scanf("%c", &ch);
}
c[i] = ch;
for(i = 0; i<sizeof(c)/sizeof(char)&&c[i] != '#'; i++){
  printf("%c", c[i]);
}
printf("\n");
//2.动态数组,使用base作为数组基址
char *base;
base = (char *)malloc(sizeof(char) * arraySize);
printf("请输入一个字符串,以空格或回车为结束标志:");
scanf("%s", base);
for(i = 0; i < strlen(base); i++){
  printf("%c", base[i]);
}
printf("\n");

//以上是两种创建数组的方式,可以自行选择
//两种皆可,如果想进行编程测试,可以通过上面的两种创建字符数组的方式,
//输入字符串,然后调用judgePalindromStr函数
//作业本上只需写judgePalindromStr函数的代码
int judgePalindromStr(char *base){
  //...
}

int judgePalindromStr(char a[]){
  //...
}

在这里插入图片描述

​ 2.为充分利用存储空间,顺序栈s0、s1共享一个存储区elem[0, …, maxSize-1]。试设计共享栈s0,s1以及有关的入栈、出栈操作的算法,假设栈中元素为int型。

​ (1)给出基本的设计思想。

​ (2)根据设计思想,采用C语言描述算法。

//共享栈的结构体定义
typedef struct{
  int elem[maxSize];
  int top[2];       //top[0], top[1]分别为s0、s1的栈顶指针;0,maxSize-1分别为两个栈顶指针的初始值
}SqStack;

int push(SqStack *st, int stNo, int x){ //stNo是栈的编号,取值范围是0或1,指示x插入到哪个栈中,
  //判断栈是否满
}

int pop(SqStack *st, int stNo, int *x){//stNo是栈的编号,取值范围是0或1,指示哪个栈弹出元素
  //判断栈是否空
}

练习3:

  1. 编写算法,将一个非负的十进制数N转换为一个二进制数。

​ 要求:使用栈。

​ 测试用例:10(1010)、21(10101)、34(100010)

  1. 试编写算法,检查输入的程序中的中括号和圆括号是否配对。

​ 注意:括号可以嵌套,即: ‘’[()]()’ 这种形式,但 ‘([)’ 或者 ‘([]’ 都不符合要求。

  1. 如果允许在循环队列两端都可以进行插入和删除操作,

​ (1)试写出循环队列的类型定义,并解释变量的含义;

​ (2)写出"从队尾删除"和"从队头插入"的算法。

​ 提示:此为双端队列的概念,队列两端均可进行插入删除,将之想象成底部贴合在一起的两个栈。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李子树_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值