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

实验 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,一经查实,立即删除!

相关文章

Day22 opencv图像预处理

图像预处理 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;常见的操作包括图像空间转换、图像大小调…

LabVIEW for Linux 介绍

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

axios竟态问题

竟态问题 在我们日常开发经常遇到一些竟态问题 例子1 现象1 表格分页&#xff0c;如果设置请求loading, 先切换到分页第99页&#xff0c;迅速在又切换到第1页&#xff0c;最后列表显示的是第99页数据。 原因 由于第99页请求数据花费时间可能500ms,第1页数据只需要100ms,第1页…

《深入浅出HTTPS​​​​》读书笔记(4):密码学

解决HTTP安全的方法就是采用HTTPS&#xff0c;理解HTTPS之前必须掌握基本的密码学知识&#xff0c;HTTPS本质上就是对密码学算法的组合。 【密码学的四个目标】 1&#xff09;机密性&#xff08;隐私性&#xff09; 在网络中传递的数据如果具备机密性&#xff0c;那么传输的数据…

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

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

递归到分治

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

yarn : 无法加载文件,未对文件 进行数字签名。无法在当前系统上运行该脚本。

执行这个命令时报错&#xff1a;yarn --registryhttps://registry.npm.taobao.org yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1。未对文件 C:\Users\Administ rator\AppData\Roaming\npm\yarn.ps1 进行数字签名。无法在当前系统上运行该脚本。有…

数据结构(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;成功地本地化测试解决…

nignx代理获取真实地址request.getRequestURL()

# 反向代理配置到后端接口 location /prod-api/ { # proxy_set_header Host $proxy_host; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarde…

报错: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…

1015:计算并联电阻的阻值

【题目描述】 对于阻值为 r1和 r2 的电阻&#xff0c;其并联电阻阻值公式计算如下&#xff1a;R1/((1/r1)(1/r2))。输入两个电阻阻抗大小&#xff0c;浮点型。输出并联之后的阻抗大小&#xff0c;结果保留小数点后2位。 【输入】 两个电阻阻抗大小&#xff0c;浮点型&#xff0…

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…