当前位置: 首页 > news >正文

第三章 栈和队列——课后习题解练【数据结构(c语言版 第2版)】

第三章 栈和队列

1.选择题

(1)(2)(3)(4)

答案:CCDA

(5)

(6)(7)(8)

答案:DAB

(9)

(10)(11)(12)

答案:DDD

(13)

(14)

答案:C

(15)

答案:B.终止条件和递归部分

2.算法设计题

(1)

双栈初始化函数

// 双栈初始化
int InitDblStack(DblStack *S, int maxsize) {S->v = (SElemType *)malloc(sizeof(SElemType) * maxsize);if (!S->v) {return 0;  // 内存分配失败}S->m = maxsize;// 0号栈:从数组左端向右增长S->bot[0] = 0;S->top[0] = -1;     // 栈空条件:top[0] == -1// 1号栈:从数组右端向左增长S->bot[1] = maxsize - 1;S->top[1] = maxsize; // 栈空条件:top[1] == mreturn 1;  // 初始化成功
}

判断栈空函数

// 判断栈是否为空
int StackEmpty(DblStack *S, int i) {if (i == 0) {return S->top[0] == -1;      // 0号栈空} else if (i == 1) {return S->top[1] == S->m;    // 1号栈空}return -1;  // 栈编号错误
}

判断栈满函数

// 判断栈是否满(两栈相遇)
int StackFull(DblStack *S) {return S->top[0] + 1 == S->top[1];  // 两栈顶指针相邻
}

进栈函数

// 元素进栈
int Push(DblStack *S, int i, SElemType x) {if (StackFull(S)) {return 0;  // 栈满,进栈失败}if (i == 0) {  // 0号栈进栈S->top[0]++;           // 栈顶指针右移S->v[S->top[0]] = x;   // 存入元素} else if (i == 1) {       // 1号栈进栈S->top[1]--;           // 栈顶指针左移S->v[S->top[1]] = x;   // 存入元素} else {return 0;  // 栈编号错误}return 1;  // 进栈成功
}

出栈函数

// 元素出栈
int Pop(DblStack *S, int i, SElemType *x) {if (StackEmpty(S, i)) {return 0;  // 栈空,出栈失败}if (i == 0) {  // 0号栈出栈*x = S->v[S->top[0]];  // 取出元素S->top[0]--;           // 栈顶指针左移} else if (i == 1) {       // 1号栈出栈*x = S->v[S->top[1]];  // 取出元素S->top[1]++;           // 栈顶指针右移} else {return 0;  // 栈编号错误}return 1;  // 出栈成功
}

(2)

// 定义顺序栈的存储结构
#define StackSize 100  // 预分配的栈空间最多为100个元素
typedef char DataType; // 栈元素的数据类型为字符typedef struct {DataType data[StackSize];  // 栈的存储数组int top;                    // 栈顶指针
} SeqStack;// 函数功能:判断字符向量是否为回文
// 参数说明:bunch - 待判断的字符串指针
// 返回值:1表示是回文,0表示不是回文
int IsHuiwen(char *bunch) {SeqStack s;     // 定义顺序栈int i, len;      // i:循环计数器,len:字符串长度char temp;       // 临时变量,用于存储出栈的字符// 初始化栈InitStack(&s);// 获取字符串长度len = strlen(t);// 将字符串的前半部分字符入栈// 例如:"abcdcba" -> 前3个字符"abc"入栈for (i = 0; i < len / 2; i++) {Push(&s, bunch[i]);}// 处理奇数长度字符串的中间字符// 如果长度为奇数,从中间字符的下一个开始比较// 如果长度为偶数,直接从后半部分开始比较if (len % 2 == 0) {i = len / 2;    // 偶数长度:从中间开始比较} else {i = len / 2 + 1; // 奇数长度:跳过中间字符}// 依次弹出栈中字符与字符串后半部分比较while (!EmptyStack(&s)) {temp = Pop(&s);     // 弹出栈顶字符// 比较弹出的字符与字符串对应位置的字符if (temp != bunch[i]) {return 0;       // 发现不匹配,不是回文} else {i++;            // 继续比较下一个字符}}// 所有字符都匹配,是回文return 1;
}

(7)

循环队列结构定义

#define MAXSIZE 100  // 队列最大容量typedef struct {int *Q;           // 存放队列元素的数组int front;         // 队头指针int rear;          // 队尾指针  int tag;           // 队列状态标志:0-空,1-满int m;             // 队列实际容量
} CycleQueue;

队列初始化函数

// 判断队列是否为空
// 空队列条件:front == rear 且 tag == 0
int QueueEmpty(CycleQueue *cq) {return (cq->front == cq->rear) && (cq->tag == 0);
}// 判断队列是否已满  
// 满队列条件:front == rear 且 tag == 1
int QueueFull(CycleQueue *cq) {return (cq->front == cq->rear) && (cq->tag == 1);
}

插入算法(enqueue)

// 元素入队算法
// 参数:cq - 队列指针,x - 要插入的元素
// 返回值:1-成功,0-失败(队列已满)
int enqueue(CycleQueue *cq, int x) {// 检查队列是否已满if (QueueFull(cq)) {printf("队列已满,无法插入元素 %d\n", x);return 0;}// 在队尾插入元素cq->Q[cq->rear] = x;// 队尾指针循环后移cq->rear = (cq->rear + 1) % cq->m;// 插入元素后,队列肯定不空,设置tag=1cq->tag = 1;printf("元素 %d 入队成功\n", x);return 1;
}

删除算法(dequeue)

// 元素出队算法  
// 参数:cq - 队列指针,x - 用于返回出队元素的指针
// 返回值:1-成功,0-失败(队列为空)
int dequeue(CycleQueue *cq, int *x) {// 检查队列是否为空if (QueueEmpty(cq)) {printf("队列为空,无法删除元素\n");return 0;}// 保存队头元素*x = cq->Q[cq->front];// 队头指针循环后移cq->front = (cq->front + 1) % cq->m;// 删除元素后,队列肯定不满,设置tag=0cq->tag = 0;printf("元素 %d 出队成功\n", *x);return 1;
}
http://www.dtcms.com/a/502979.html

相关文章:

  • Kubernetes Ingress与安全机制
  • 【企业架构】TOGAF架构标准规范-机会与解决方案
  • apache建设本地网站wordpress修改成中文字体
  • windows平台,用pgloader转换mysql到postgresql
  • Linux驱动第一期1-10-驱动基础总结
  • 我的WordPress网站梅林固件做网站
  • 分库分表:基础介绍
  • 使用css `focus-visible` 改善用户体验
  • AI人工智能-深度学习的基本原理-第二周(小白)
  • 【2070】数字对调
  • 【AI智能体】Coze 提取对标账号短视频生成视频文案实战详解
  • IOT项目——ESP系列
  • 【成长纪实】Dart 与 ArkTS 函数与类的对比学习:从 Flutter 到 HarmonyOS
  • 基于 JETSON+FPGA+GMSL+AI 车载视频采集与存储系统设计(二)系统测试
  • Flutter Event Loop
  • LeetCode 1287.有序数组中出现次数超过25%的元素
  • 递归-50.Pow(x,n)-力扣(LeetCode)
  • Flutter 并发编程全解:从零掌握 Isolate
  • 跨网络互联技术(①Singbox Core-Flutter-Android)
  • 移动端网站的重要性做一款推荐类的网站
  • 用div做网站中间部分做网站是干啥的
  • 【思维导图SimpleMind Pro】SimpleMind Pro——轻量级思维导图软件完全指南:轻量专业,让思维高效可视化
  • jlink烧入软件的使用
  • 03-流程控制语句-教程
  • 【mqtt参数上云和小程序开发】【第5期】hcsr04超声波测距模块调试完成
  • 【STM32笔记】:P03 ISP 一键下载电路详解
  • 江苏省网站建设哪家好php做的购物网站
  • 常见的位运算的总结
  • CSRF(跨站请求伪造)攻击详解:原理、途径与防范
  • 【C++】使用双指针算法习题