【数据结构】宜宾大学-计院-实验六

实验 6 栈和队列(综合实验)

  • 实验目的:
  • 实验内容:
    • 进制转换问题:
      • 第1题测试结果:
      • 第1题代码实现:
    • 括号匹配问题:
      • 第2题测试结果:
      • 第2题代码实现:
    • 回文字符串问题:(栈)
      • 第3题(实验自带做法,纯C)

实验目的:

熟悉掌握数据结构中队列的基本操作,能够结合栈与队列的结构灵活解决一些实际中问题。

实验内容:

备注:1,2 任选一题
1.用栈的操作实现10进制数和d进制数的转换,并输出结果

2.括号配对的检测: 利用栈来解决括号配对问题,左括号配右括号, 如: ( ) 配对正确 ( ] 配对错误 ( [ ] ) 配对正确 ( [ ) ) 配对错误。

3.在许多语言现象中,常见到一种形如abcba的文字,这种文字从左到右读和从右到左读结果是一样的,这种文字就是常说的回文。设计一个程序可以判断给定的一个文字串是否是回文。

注意:在本实验中,要求在实现上面的题目时,必须使用如下算法: 考虑到栈的先进后出以及队列的先进先出,可以结合这两种结构来实现需要的功能,即将文字串分别入队和入栈,然后依次通过出队和出栈输出判断是否有不相同的字符,一旦发现就证明文字不是一个回文。
实验步骤:
第一步:编写程序,实现栈,该栈可以用数组实现,也可以用链表实现
第二步:编写程序,实现队列,该队列可为循环队列,也可以用链表实现
第三步:编写主算法,使用自己编写的栈和队列实现回文判断问题(通过键盘输入一个以#结束的字符串,进行判断)

进制转换问题:

第1题测试结果:

在这里插入图片描述

第1题代码实现:

由于实验四那里也有这个题的低级版本,所以这里借用实验四当时实现的栈来完成本小题。

void conversion()
{int num, x;cout << "请输入要转化的十进制数字:" << endl;cin >> num;cout << "期望将它转化为几进制数:" << endl;cin >> x;cout << "将十进制数 " << num  << " " << "转化为 " << x << " " << "进制数得到的结果为:" << endl;ST st;InitStack(st);while (num > 0){Push(st, num % x);num /= x;}while (!EmptyStack(st)){cout << GetTop(st);PopTop(st);}DestroyStack(st);
}int main()
{conversion();return 0;
}

括号匹配问题:

第2题测试结果:

在这里插入图片描述

第2题代码实现:

下面代码用c++写便捷一点;纯c解题思路完全一样;即直接使用C++自带stack和string。

#include<iostream>
#include<stack>
#include<string>
using namespace std;bool Match(string str)
{stack<char> s;int count = 0;//计数,处理部分特殊情况,如1.只有一个括号,如2.第一个或最后一个为右括号for (int i = 0; i < str.size(); i++){if (str[i] == '{' || str[i] == '[' || str[i] == '<' || str[i] == '('){s.push(str[i]);count++;}if (str[i] == ')' && !s.empty()){count++;if (s.top() == '(')s.pop();elsereturn false;}if (str[i] == '>' && !s.empty()){count++;if (s.top() == '<')s.pop();elsereturn false;}if (str[i] == ']' && !s.empty()){count++;if (s.top() == '[')s.pop();elsereturn false;}if (str[i] == '}' && !s.empty()){count++;if (s.top() == '{')s.pop();elsereturn false;}}if (count != str.size())return false;return s.empty();
}int main()
{string str1("><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]");string str2("{{}}{{}}<<>><<>>(())(())[[]][[]]");string str3("}");string str4("}[]()");string str5("}}}[]()");string str6("[][]))");cout << Match(str1) << endl;cout << Match(str2) << endl;cout << Match(str3) << endl;cout << Match(str4) << endl;cout << Match(str5) << endl;cout << Match(str6) << endl;return 0;
}

回文字符串问题:(栈)

第3题(实验自带做法,纯C)

这里的代码是比较老旧的写法了,下面是实验里面提供的一个栈,合理里利用这个栈来达到了第3小题的判断回文字符串的目的,第3小题在这里的它提供的做法目的就仅仅是锻炼使用栈的能力而已。

#include"stdlib.h"#include"stdio.h"  
#define STACK_INCREAMENT 10   //宏定义,堆栈增量;无分号 #define STACK_INI_SIZE 100   //宏定义,堆栈初始空间大小  
typedef char ElemType;  //堆栈元素类型为chartypedef struct{ ElemType *base;  ElemType *top;  int  stacksize; 
}sqstack;//结构体,顺序结构存储的栈的首尾指针  
typedef struct QNode{  
char  data; struct QNode *next; 
}QNode,*Queueptr;  //结构体,链式结构的队列  
typedef struct{  
Queueptr front;  
Queueptr rear; 
}linkQueue;   //结构体,用于存放队列的首尾指针  
void initStack(sqstack &s){ 
s.base=(ElemType*)malloc(STACK_INI_SIZE*sizeof(ElemType));  if(!s.base)   
exit(0);  
s.top=s.base; s.stacksize=STACK_INI_SIZE;}//初始化空栈  
void initLinkQueue(linkQueue &q){ q.front=(Queueptr)malloc(sizeof(QNode)); if(!q.front)   
exit(0);  
q.rear=q.front; 
}//初始化空队列void push(sqstack &s,ElemType e){  
if(s.top-s.base>=s.stacksize)
{   
ElemType *newbase;  newbase=(ElemType*)realloc(s.base,(STACK_INI_SIZE+STACK_INCREAMENT)*sizeof(ElemType));  if(!newbase)      
exit(0);   
s.base=newbase;   
s.top=s.base+s.stacksize;   
s.stacksize=STACK_INI_SIZE+STACK_INCREAMENT;  
}//追加空间  
*s.top=e;  
s.top++; 
}//元素入栈操作  
void pop(sqstack &s,ElemType &e){  
if(s.base==s.top)   
return;   //栈空,退出  
s.top--;  
e=*s.top; 
}//元素出栈,并用e返回其值  
void EnQueue(linkQueue &q,char c){  
Queueptr pre=q.rear; 
q.rear=(Queueptr)malloc(sizeof(QNode));  
q.rear->data=c; 
q.rear->next=NULL;  
pre->next=q.rear; 
}//元素入队列操作  
void DeQueue(linkQueue &q,char &e){  
Queueptr temp=q.front;  
e=temp->data; 
q.front=q.front->next;  
free(temp); 
}//元素出队列操作,并用e返回其结点数据域int main(){ sqstack s;//定义堆栈结构体,用于存放堆栈首尾指针  
linkQueue lQueue;//定义结构体,用于存放队列首尾指针  
char c; initStack(s);//初始化一个空的堆栈 initLinkQueue(lQueue);//初始化一个空的队列  
printf("请输入一串字符,并以#结束:\n");    
scanf("%c",&c);  
while(c!='#') {   
push(s, c); //字符入栈   
EnQueue(lQueue, c);//字符入队列     
scanf("%c",&c);   }//分别向堆栈与队列中存入该字符串  
lQueue.front=lQueue.front->next;  
while(!(s.top==s.base)){   
char a,b;   
pop(s,a);  //字符出栈     
DeQueue(lQueue,b);  //字符出队列   
if(a!=b) {    
printf("该字符串不是回文字\n");  //不是回文字    
exit(0);      
}//两字符进行比较 
}//将堆栈与队列中的元素出栈,并进行比较,判断该字符串是否为回文字  
printf("该字符串是回文字\n");  //输出判断结果,是回文字  
return 0; 
}//主程序,完成回文字符串的判定,并输出判定结果

学习C++得看这

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW for Linux 介绍

LabVIEW for Linux 介绍 1. 兼容性 LabVIEW for Linux 设计用于多种 Linux 发行版&#xff0c;包括 CentOS、Ubuntu 等。在安装之前&#xff0c;务必检查与您特定发行版版本的兼容性。 2. 程序移植 可移植性&#xff1a;在许多情况下&#xff0c;LabVIEW 程序&#xff08;VI…

《Python游戏编程入门》注-第4章2

《Python游戏编程入门》的“4.2.2 键盘事件”中介绍了通过键盘事件来监听键盘按键的方法。 1 键盘事件 玩家点击键盘中某个按键实际上包含了两个动作&#xff1a;点击按键和释放按键&#xff0c;也就是按键按下和松开。按键按下的对应的事件是KEYDOWN&#xff0c;按键松开对应…

递归到分治

一、递归与分治&#xff1a; 1、递归&#xff1a;如果一个问题分可以简化为某些更小的、更简单的子问题来解决&#xff0c;那么可以用递归 2、分治&#xff1a;如果想并行处理&#xff0c;可以用到分治 二、假设我们有一段文本&#xff0c;需要统计每个单词出现的频率。我们将…

数据结构(8.5_2)——基数排序

基数排序 第一趟“分配”&#xff1a;按"个位"进行分配 第一趟“收集”&#xff1a; 第二趟“分配”&#xff1a;按"十位"进行分配("个位"越大的越先入队) 第二趟“收集”&#xff1a; 第三趟“分配”&#xff1a;按"百位"进行分配(&…

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…

漫途焊机安全生产监管方案,提升安全生产管理水平!

随着智能制造时代的到来&#xff0c;企业安全生产管理的重要性日益凸显。特别是在现代工厂中&#xff0c;焊机的安全生产监管成为了一个不容忽视的重要环节。传统的焊机安全生产监管方式存在诸多不足&#xff0c;如人工巡检频率低、数据延迟、安全隐患发现不及时等问题。因此&a…

《Linux系统编程篇》管道(Linux 进程间通信(IPC))——基础篇

文章目录 引言理解 Linux 进程间通信&#xff08;IPC&#xff09;基础什么是进程间通信&#xff08;IPC&#xff09;&#xff1f; 管道&#xff08;Pipe&#xff09;的基本介绍使用场景&#xff1a;管道特点&#xff1a;管道类型&#xff1a;匿名管道命名管道&#xff08;FIFO&…

阿拉伯国家本地化测试的特点

针对阿拉伯国家的应用程序的本地化测试需要详细了解语言、文化背景、地区规范和技术细节&#xff0c;以符合阿拉伯语用户的期望。这些国家包括沙特阿拉伯、阿拉伯联合酋长国、科威特、卡塔尔、巴林和阿曼&#xff0c;具有独特的语言和文化因素&#xff0c;成功地本地化测试解决…

报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

报错场景 使用npm run dev 报错 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm…

RabbitMQ的路由模式

路由模式 队列与交换机的绑定&#xff0c;不能是任意绑定了&#xff0c;而是要指定一个 RoutingKey&#xff08;路由key&#xff09; 消息的发送方在向 Exchange 发送消息时&#xff0c;也必须指定消息的 RoutingKey Exchange 不再把消息交给每一个绑定的队列&#xff0c;而是…

FastAPI性能对比:同步vs异步

大家好&#xff0c;FastAPI已成为构建Python API的最流行框架之一&#xff0c;因其速度和易用性而广受欢迎。但在构建高性能应用程序时&#xff0c;使用同步&#xff08;sync&#xff09;还是异步&#xff08;async&#xff09;代码执行是很重要的问题。本文将通过现实世界的性…

diffusion model 学习笔记

条件引导的 diffusion 对于无条件的DDPM 而言 p ( x t ∣ x 0 ) ∼ N ( α t ˉ x 0 , 1 − α t ˉ ⋅ I ) p(x_t | x_0) \sim \mathcal{N}( \sqrt{\bar{\alpha_t}} x_0, 1-\bar{\alpha_t} \cdot \mathrm{I} ) p(xt​∣x0​)∼N(αt​ˉ​ ​x0​,1−αt​ˉ​⋅I) 可以得到…

3.4 大数据生态

文章目录 1. 数据存储1.1 Apache Hadoop - HDFS1.2 Apache HBase1.3 Apache Kudu1.4 云平台存储组件 2. 数据计算2.1 Apache Hadoop - MapReduce2.2 Apache Hive2.3 Apache Spark2.4 Apache Flink 3. 数据传输3.1 Apache Kafka3.2 Apache Pulsar3.3 Apache Flume3.4 Apache Sqo…

Community Enterprise Operating System

起源与背景 CentOS项目始于2003年&#xff0c;由一群热心的Linux用户和开发者共同发起。 它的诞生旨在为用户提供一个免费且与RHEL高度兼容的操作系统&#xff0c;满足那些希望使用RHEL的稳定性和安全性但又不想支付商业许可费用的用户和组织的需求。 CentOS社区会将Red Hat…

论文精读:PRL RuO2中不存在交错磁自旋分裂

Phys. Rev. Lett., 2024, 133, 176401. https://doi.org/10.1103/PhysRevLett.133.176401 https://mp.weixin.qq.com/s/Miv6kvT5vh-Sha1xP38YLQ 摘要节选 金红石RuO2被认为是一种潜在的d波交变磁候选材料&#xff0c;预测自旋分裂高达1.4 eV。尽管积累了理论预测和输运测量…

【GIN】go-gin 中 validator 验证功能

文章目录 前言一、基础用法二、常用字段说明常用字段说明1. required2. len3. min 和 max4. gte 和 lte 、 gt 和 lt 、ne5. oneof6. email7. url 三、示例代码运行效果 总结 前言 在 Go 中使用 Gin 框架时&#xff0c;BindJSON 可以将 JSON 请求体中的数据绑定到结构体上&…

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

RSTP的工作过程

RSTP简介&#xff1a; 生成树协议&#xff08;STP&#xff09;用于在网络中防止环路产生&#xff0c;但 STP 的收敛速度较慢。 RSTP&#xff08;Rapid Spanning Tree Protocol &#xff09;快速生成树协议&#xff1a;RSTP 是对 STP 的改进&#xff0c;它能在网络拓扑发生变化…

HTML 结构化标签完全指南:<html>、<head>、<body> 和布局标签 <div>、<span> 的功能及其在网页中的应用

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

php把十六进制转化成字符串 和 字符串转十六进制

最近项目中碰到需要把接收十六进制的数据&#xff0c;十六进制的数据不便阅读 方法一&#xff0c;只是不同的函数 // 十六进制转字符串 function hexToStr($hex) {$hex str_replace( , , $hex); // 去除空格$string ;for ($i 0; $i < strlen($hex) - 1; $i 2) {$st…