数据结构(c++描述胡学钢)课后题解答:第二章——栈

  1. 假设栈S的一个输入序列为1, 2, 3, 4, 5,则可得到多个输出序列,如1, 2, 3, 4, 5就是一个合法的输出序列,同理,5, 4, 3, 2, 1和3, 2, 1, 4, 5也分别是其合法的输出序列。分别求解下列问题:
    (1)判断序列1, 3, 4, 5, 2是否是合法的输出序列;
    (2)输入序列1, 2, 3, 4, 5,求出其所有的合法的输出序列;
    (3)设计算法以判断对输入序列1, 2, 3, …, n,序列a1, a2, a3,
    …, an是否是该栈的合法的输出序列(假设输出序列在数组A中);
    (4)给出栈的合法的输出序列的规律。

(1)是。逻辑:1进1出,2进,3进3出,4进4出,5进5出,2出。
(2)思路:可以把入栈记为1,出栈记为0.那么前缀子序列中1的个数必须大于等于0的个数,即入栈次数要大于等于出栈次数。对于序列1,2,3,4,5,其所有元素入栈和出栈次数总和为10次,比如:
1 1 1 0 0 1 0 1 0 0,即对应过程为1进2进3进3出2出4进4出5进5出1出,结果为3 2 4 5 1。那么现在的问题就转换为如何求出所有符合条件的0 1序列了。
(3)思路:对于一组序列,其合法的输出形式只有三种
①全部倒序输出。
②全部顺序输出。
③前两项相结合。
因此判断标准为,n后的每一项必须倒序输出。
例: 1 2 5 4 3合法,1 2 5 3 4非法
源代码:
#include
#define N 5//宏定义,方便修改N的值
using namespace std;
void main(){
int i, j, k,a[N];
int s, flag1, flag2;
for (i = 0; i < N; i++)
cin>>a[i];//输入数组
for (i = 0; i < N; i++){
flag1 = 0;
flag2 = 0;
for (j = i + 1; j < N; j++)//寻找s[i]之后第一个比s[i]小的
if (a[j] < a[i]){
s = a[j];//s[j]是s[i]之后第一个比s[i]小的
flag1 = 1;
break;
}
if (flag1 == 1)
for (k = j + 1; k < N; k++)
if (a[k] < a[i])//s[j]之后如果还有比s[i]小的数
if (a[k] <s)//都必须小于它之前的一个比s[i]小的数
s = a[k];//并更新temp
else{//否则,出栈序列非法
flag2 = 1;
break;
}
if (flag2 == 1)
{
cout<<“NO”;
exit(0);//退出程序
}
}
cout<<“YES”;
}
实例:
在这里插入图片描述(4)其规律可以用递归的思想推理。设F(n)为n个顺序数的合法输出个数。
当n=0或1时,F(n)=1
当n=2时,F(n)=2 1 2或2 1
当n=3时,F(n)=5 1 2 3或1 3 2 或3 2 1或2 3 1或2 1 3
当n=4时,若1在第1位,则后面有F(3)种可能;若1在第2位,则第1位一定为2,后面有F(2)种可能;若1在第3位,则前面有F(2)种可能;若1在第4位,则前面有F(3)种可能。故F(4)=F(3)*F(1)+F(2)*F(2)+F(2)*F(2)+F(1)*F(3)。
发现当有n个数时,F(n)=F(a)F(n-a),其中a取1到n。将其所有结果求和即可。结果为:卡特兰数 F(n)=C(2n,n)/(n+1)
参考:360百科https://baike.so.com/doc/6127416-6340576.html
2.如果顺序栈中的第二个分量是栈顶指针而不是记录元素个数的变量,应如何实现各算法?
若用top指针替换分量count。假设在一个具有n个单元的顺序栈中,以地址低端(即下标为0的单元)作为栈底。
(1).判断栈是否为空:
即判断top指针所指地址是否为0。
(2).取栈顶元素:
即取top指针所指地址。设用x储存所取元素,则x=⊤top=top-1;
(3).入栈运算:
即top指针向前移动一位,其所对应的地址储存x。
(s->top)=x;s->top++;
(4).出栈运算: x=top->data; top=top->next;
(5).判断栈是否为满:
即判断top指针所指地址是否为顺序栈长度。

4.对表达式#5+3*(12+4)/4-8#,依次画出在求解过程中的各步骤中的栈的状态。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

再沉淀一年!

本人高校大学生,谢谢你的激励

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

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

打赏作者

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

抵扣说明:

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

余额充值