数据结构——栈与队列

目录

 1. 中缀表达式转换为后缀表达式

 2. 括号匹配问题

3. 栈实现队列

4. 约瑟夫环


 1. 中缀表达式转换为后缀表达式

【问题描述】
 输入一个中缀表达式,表达式中有+、-、*、/四种运算以及(、),表达式中的其他符号为大写的字母。实现一个算法,得到相应的后缀表达式。

【输入形式】
 一个式子的中缀表达式,以#结束

【输出形式】
 相应的后缀表达式 

【样例输入】

 A*(B-C)/D+E#

【样例输出】

 ABC-*D/E+

【评分标准】
 请大家在程序中写出必要的注释,如果程序没有必要的注释,将酌情扣分


#include<stdio.h>
#include<string.h>#define MAX_SIZE 100
typedef struct {char data[MAX_SIZE];int top;
}Stack;void init(Stack *stack){stack->top=-1;
}int isEmpty(Stack *stack){return stack->top==-1;
}int isFull(Stack *stack){return stack->top==MAX_SIZE-1;
}void push(Stack *stack,char c){if(isFull(stack)){printf("Stack overflow\n");return;}stack->data[++stack->top]=c;
}char pop(Stack *stack){if(isEmpty(stack)){printf("Stack underflow\n");return '\0';}return stack->data[stack->top--];
}int getPriority(char c){if(c=='+'||c=='-'){return 1;}else if(c=='*'||c=='/'){return 2;}else{return 0;}
}void infixToPostfix(char *infix, char *postfix){Stack s;init(&s);int i=0, j=0;while(infix[i]!='#'){if(infix[i]>='A'&&infix[i]<='Z'){postfix[j++]=infix[i];}else if(infix[i]=='('){push(&s, infix[i]);}else if(infix[i]==')'){while(!isEmpty(&s) && s.data[s.top]!='('){postfix[j++]=pop(&s);}if(!isEmpty(&s) && s.data[s.top]=='('){pop(&s);}}else{while(!isEmpty(&s) && getPriority(infix[i])<=getPriority(s.data[s.top])){postfix[j++]=pop(&s);}push(&s, infix[i]);}i++;}while(!isEmpty(&s)){postfix[j++]=pop(&s);}postfix[j]='\0';
}int main(){char infix[MAX_SIZE];scanf("%s", infix);char postfix[MAX_SIZE];infixToPostfix(infix, postfix);printf("%s\n", postfix);return 0;
}

 2. 括号匹配问题

【问题描述】

假设一算术表达式中包括三种括号:圆括号"("和")",方括号"["和"]",花括号"{"和"}",且三种括号可按意 次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现(已知表达式已存入数据元素为字符的顺序表中)。若匹配,则返回1,否则返回0。
【输入形式】

含括号的算数表达式
【输出形式】

1或者0

【样例输入】

3+(44*[5-{6*[7*(45-10)]}])

【样例输出】

1

【样例说明】

判断括号是否匹配涉及两方面,括号个数和出现次序的判定。
【评分标准】

#include <stdio.h>
#include <string.h>#define MAX_SIZE 100typedef struct {char data[MAX_SIZE];int top;
} Stack;void init(Stack *stack) {stack->top = -1;
}int isEmpty(Stack *stack) {return stack->top == -1;
}int isFull(Stack *stack) {return stack->top == MAX_SIZE - 1;
}void push(Stack *stack, char c) {if (isFull(stack)) {printf("Stack overflow\n");return;}stack->data[++stack->top] = c;
}char pop(Stack *stack) {if (isEmpty(stack)) {printf("Stack underflow\n");return '\0';}return stack->data[stack->top--];
}int isMatching(char left, char right) {if (left == '(' && right == ')') {return 1;} else if (left == '[' && right == ']') {return 1;} else if (left == '{' && right == '}') {return 1;} else {return 0;}
}int isParenthesesMatching(char *expression) {Stack stack;init(&stack);int i;int length = strlen(expression);for ( i = 0; i < length; i++) {char c = expression[i];if (c == '(' || c == '[' || c == '{') {push(&stack, c);} else if (c == ')' || c == ']' || c == '}') {if (isEmpty(&stack)) {return 0;}char top = pop(&stack);if (!isMatching(top, c)) {return 0;}}}return isEmpty(&stack);
}int main() {char expression[MAX_SIZE];fgets(expression, MAX_SIZE, stdin);int result = isParenthesesMatching(expression);printf("%d\n", result);return 0;
}

3. 栈实现队列

【问题描述】

请使用栈类实现队列的类。

【输入形式】

第一行一个整数n,

接下来n行,每行一个整数,依次表示已经在队列中的数。

接下来一行,一个整数m。

接下来m行,有两种情况:1. 一个整数,请将其入列。2. 字符串"D",表示出列操作。

【输出形式】

若干行,每行一个出列的输出。

【样例输入】

3
1
2
3
2
4
D

【样例输出】

1

【样例说明】

队列中原来有1,2,3三个数,第一个操作使4入列,第二个操作出列,弹出队头的1
【评分标准】

通过所有数据

#include <stdio.h>
#include <string.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;
} Stack;void init(Stack *stack) {stack->top = -1;
}int isEmpty(Stack *stack) {return stack->top == -1;
}int isFull(Stack *stack) {return stack->top == MAX_SIZE - 1;
}void push(Stack *stack, int num) {if (isFull(stack)) {printf("Stack overflow\n");return;}stack->data[++stack->top] = num;
}int pop(Stack *stack) {if (isEmpty(stack)) {printf("Stack underflow\n");return 0;}return stack->data[stack->top--];
}int main() {int n, m;scanf("%d", &n);Stack s1, s2;init(&s1);init(&s2);int i;for (i = 0; i < n; i++) {int num;scanf("%d", &num);push(&s1, num);}scanf("%d", &m);for (i = 0; i < m; i++) {char temp_str[2];scanf("%s", temp_str);if (strcmp(temp_str, "D") == 0) {if (isEmpty(&s2)) {while (!isEmpty(&s1)) {int num = pop(&s1);push(&s2, num);}}int result = pop(&s2);printf("%d\n", result);n--;} else {int num = atoi(temp_str);push(&s1, num);n++;}}return 0;
}

4. 约瑟夫环

【问题描述】

n个人围成一个圈,按顺时针方向一次编号1、2、3、……、n,从第一个人开始顺时针方向依次报数1、2、3、……,报数m的人被淘汰,然后下一个人再从1开始报数,一直重复该过程。由于人数是有限的,因此最后一定只会剩下一个人,求这个人的编号。

【输入形式】

第一行,一个整数n,表示约瑟夫环的总人数。

第二行,一个整数m,表示报到m的人被淘汰。

【输出形式】

 一行,一个整数,约瑟夫环最终剩下的人的编号。

【样例输入】

5
2

【样例输出】

3

【样例说明】

5个人围成一圈,编号1,2,3,4,5;

第一轮,2号淘汰,剩下1,3,4,5;

第二轮,从3开始报数,4号淘汰,剩下1,3,5;

第三轮,从5开始报数,1号淘汰,剩下3,5;

第四轮,从3开始报数,5号淘汰,剩下3。
【评分标准】

通过所有数据

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node,*LinkList;LinkList createNode(int data) {LinkList newNode = (LinkList)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;return newNode;
}void appendNode(LinkList* head, int data) {LinkList newNode = createNode(data);if (*head == NULL) {*head = newNode;newNode->next = *head;} else {LinkList temp = *head;while (temp->next != *head) {temp = temp->next;}temp->next = newNode;newNode->next = *head;}
}void deleteNode(LinkList* head, int m) {if (*head == NULL) {return;}LinkList current = *head;LinkList prev = NULL;while (current->next != *head) {prev = current;current = current->next;}if (current == *head && current->next == *head) {*head = NULL;free(current);return;}int i;for ( i = 1; i <=m; i++) {prev = current;current = current->next;}prev->next = current->next;free(current);*head = prev->next;
}int josephus(int n, int m) {LinkList head = NULL;int i;for (i = 1; i <= n; i++) {appendNode(&head, i);}while ( head!=head->next) {deleteNode(&head, m);}return head->data;
}int main() {int n, m;scanf("%d%d", &n, &m);int result = josephus(n, m);printf("%d\n", result);return 0;
}

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

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

相关文章

持续集成部署-k8s-服务发现-Ingress

持续集成部署-k8s-服务发现-Ingress 1. Ingress 是什么2. Ingress 控制器3. 安装 Ingress-Nginx3.1 添加 Helm 仓库3.2 更新 Helm 仓库3.3 下载 Ingress-Nginx 安装包3.4 配置 Ingress-Nginx 配置文件参数3.5 安装 Ingress-Nginx1. Ingress 是什么 Ingress是 Kubernetes 中的一…

力扣1047删除字符串中的所有相邻重复项(java,栈解法)

Problem: 1047. 删除字符串中的所有相邻重复项 文章目录 思路解题方法复杂度Code 思路 最直观的思路就是比较当前字的字符和相邻&#xff08;也包含删除后再相邻&#xff09;的上一字符是否相同&#xff0c;若相同则想办法去除两相同的字符&#xff0c;而关键就在如何较为便捷的…

QT webengine显示HTML简单示例

文章目录 参考示例1TestWebenqine.promainwindow.hmainwindow.cppmain.cpp效果 示例2 (使用setDevToolsPage函数)main.cpp效果 参考 QT webengine显示HTML简单示例 示例1 编译器 : Desktop Qt 5.15.2 MSVC2019 64bit编辑器: QtCreator代码: TestWebenqine.pro # TestWeben…

C#列表List的创建与使用

文章目录 C#列表List的创建与使用创建空列表方式一方式二 初始化创建插入数据逐个添加批量添加 访问列表遍历for循环foreach循环 C#列表List的创建与使用 创建空列表 方式一 List<string> pkValues new List<string>();方式二 var pkValues new List<stri…

pycharm运行R语言脚本(win10环境下安装)

文章目录 简介1. pycharm安装插件2. 安装R语言解释器2.1下载安装包2.2具体安装过程 3.编辑环境变量4 检验是否安装成功&#xff1a;5.安装需要的library6.pycharm中配置安装好的R语言解释器 简介 pycharm 安装 R language for Intellij R language for Intellij 是一个插件&am…

06-Flask-蓝图的使用

蓝图的使用 前言蓝图使用方式 前言 本篇来学习下Flask中蓝图的使用 蓝图 在Flask中使用蓝图(Blurprint)来分模块组织管理蓝图可以理解为存储一组视图方法的容器对象&#xff0c;特点如下&#xff1a; 一个应用可以具有多个Blueprint可以将一个Blueprint注册到任何一个未使用…

震惊!原来BUG是这么理解的!什么是BUG?软件错误(BUG)的概念

较为官方的概念&#xff1a; 当且仅当规格说明是存在的并且正确&#xff0c;程序与规格说明之间的 不匹配才是错误。 当需求规格说明书没有提到的功能&#xff0c;判断标准以最终用户为准&#xff1a;当程序没有实现其最终用户合理预期的 功能要求时&#xff0c;就是软…

【Python 零基础入门】常用内置函数 初探

【Python 零基础入门】内容补充 1 常用内置函数 Python 简介为什么要学习内置函数数据类型和转换int(): 转为整数float(): 转为浮点数list(): 转为列表tuple(): 转换为元组set():转换为集合dict(): 创建字典: 数学运算abs(): 绝对值pow(): 幂运算round(): 四舍五入min(): 最小值…

NPM【问题 01】npm i node-sass@4.14.1报错not found: python2及Cannot download问题处理

node-sass安装问题处理 1.问题2.处理2.1 方案一【我的环境失败】2.2 方案二【成功】2.3 方案三【成功】 1.问题 gyp verb which failed Error: not found: python2 # 1.添加Python27的安装路径到环境变量 gyp verb check python checking for Python executable "python…

leetcode:1154. 一年中的第几天(python3解法)

难度&#xff1a;简单 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&#xff1a; 输入&#xff1a;date "2019-01-09" 输出&#xff1a;9 解释&#xff1a;给定日期是2019年的第九天。 示例…

51单片机实验:数码管动态显示00-99

1、实验要求 利用STC89C52RC单片机开发板实现&#xff1a;使用2位数码管循环显示00-99&#xff0c;每次间隔1s&#xff0c;并且当计数到20时&#xff0c;则蜂鸣器鸣响1次。 2、实验分析 程序实现分析&#xff1a; 1、定义数码管位选引脚&#xff08;P2.4、P2.5、P2.6、…

如何在深度学习领域取得个人的成功

要在深度学习领域取得个人的成功&#xff0c;可以考虑以下建议&#xff1a; 学习深度学习的基础知识&#xff1a;首先&#xff0c;建立坚实的深度学习基础知识是非常重要的。你可以学习深度学习的基本概念、神经网络的原理、常用的深度学习框架&#xff08;如TensorFlow、PyTor…

idea上怎么将新创建项目转为maven项目

场景 在刚创建的一个项目中&#xff0c;往往没有被识别为maven项目&#xff0c;怎么做呢&#xff1f; 方法 然后选maven&#xff0c;这样这个项目就变成了maven项目

12.计算性能

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 深度学习硬件&#xff1a;CPU 和 GPU一、CPU 和 GPU二、QA No.2 深度学习硬件&#xff1a;TPU和其他一、更多的芯片二、QA No.3 单机多卡并行一、单机多卡并行二、QA No.4 多GPU训练实现一、从零开始二、D2L代码注意点三…

算法随想录算法训练营第四十六天| 583. 两个字符串的删除操作 72. 编辑距离

583. 两个字符串的删除操作 题目&#xff1a;给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思路&#xff1a;这题思路主要是求出 word1 字符串和 word2 字符串中的最长相同的子字符串&…

TYWZOJ 种树苗 待定题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示思路与部分实现完整代码 题目描述 在游戏 Minecraft 中&#xff0c;玩家可以通过种树来使木材再生。玩家需要将树苗种在泥土上&#xff0c;然后等待它长成大树&#xff0c;期间可以利用骨粉来催熟树苗。…

UE4 体积云制作 学习笔记

首先Noise本来就是一张噪点图 云的扰动不能太大&#xff0c;将Scale调小&#xff0c;并将InputMin调整为0 形成这样一张扰动图 扰动需要根据材质在世界的位置进行调整&#xff0c;所以Position需要加上WorldPosition 材质在不同世界位置&#xff0c;噪点不同 除以一个数&#…

9-MySQL提高数据管理效率(分库分表实践)

MySQL提高数据管理效率&#xff08;分库分表实践&#xff09; 在当今的互联网时代&#xff0c;随着业务规模的不断扩大&#xff0c;数据量也呈现出爆炸性的增长。如何有效地管理和存储这些数据&#xff0c;以及提高数据库的性能和可扩展性&#xff0c;成为了一个迫切需要解决的…

UI组件库基础

UI组件库 全局组件* 全局注册组件 & 并且使用了require.context 模块化编程 & webpack打包 const install(Vue)>{const contextrequire.context(.,true,/\.vue$/)context.keys().forEach(fileName>{const modulecontext(fileName)Vue.component(module.default.n…

驱动开发day8(基于GPIO子系统编写LED驱动,编写应用程序进行测试,设置定时器,5秒钟打印一次hello world)

头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__#define LED_ON _IOW(l, 1,int) #define LED_OFF _IOW(l, 0,int) #endif c文件 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <sy…