SDUST数据结构 - chap3 栈和队列
一、判断题:
二、选择题:
三、编程题:
7-1 一元多项式求导:
输入样例:
- 3 4 -5 2 6 1 -2 0
输出样例:
- 12 3 -10 1 6 0
代码:


- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- int a, b;
- int s = 0;//用于计算系数和幂的乘积
- cin>>a>>b;
- if(b != 0)
- cout<<(a*b)<<" "<<(b-1);//先计算一组,方便最后一组末尾的消除空格
- else//特殊情况:即多项式为常数的情况
- {
- cout<<"0 0";
- return 0;
- }
- while(scanf("%d %d", &a, &b) != EOF)//输入多组数据
- {
- if(b != 0)
- {
- s = a*b;
- cout<<" "<<s<<" "<<(b-1);//进行求导计算
- }
- }
- return 0;
- }
7-2 堆栈操作合法性:
输入样例:
- 4 10
- SSSXXSXXSX
- SSSXXSXXS
- SSSSSSSSSSXSSXXXXXXXXXXX
- SSSXXSXXX
输出样例:
- YES
- NO
- NO
- NO
代码:


- #include<stdio.h>
- #include<string.h>
- int main()
- {
- char s[101];
- int n, m;
- scanf("%d%d", &n, &m);//读入数据
- for(int i=0;i<n;i++)//
- {
- scanf("%s",s);
- int len = strlen(s);//计算字符串长度
- int flag1=0,flag2=1;
- for(int j=0;j<len;j++)
- {
- if(s[j] == 'S')//统计入栈的次数
- flag1++;
- else
- flag1--;
- if(flag1<0||flag1>m)//若入栈次数小于零(出栈次数大宇入栈次数)或超出题目要球,均不符合
- {
- printf("NO\n");
- flag2=0;
- break;
- }
- }
- if(flag2==1)//符合题目要求同时输出字符串也符合要求
- {
- if(flag1==0)
- printf("YES\n");
- else
- printf("NO\n");
- }
- }
- }
7-3 符号配对:
输入样例1:
- void test()
- {
- int i, A[10];
- for (i=0; i<10; i++) /*/
- A[i] = i;
- }
- .
输出样例1:
- NO
- /*-?
输入样例2:
- void test()
- {
- int i, A[10];
- for (i=0; i<10; i++) /**/
- A[i] = i;
- }]
- .
输出样例2:
- NO
- ?-]
输入样例3:
- void test()
- {
- int i
- double A[10];
- for (i=0; i<10; i++) /**/
- A[i] = 0.1*i;
- }
- .
输出样例3:
- YES
代码:


- #include <bits/stdc++.h>
- using namespace std;
- //#define OVERFLOW -2
- #define STACK_INIT_SIZE 100
- #define OK 1
- char temp;//创建全局变量,供函数内判断和主函数判断共同使用。
- typedef struct Stack//
- {
- char *base;
- char *top;
- int stack_size;
- }Stack;
- void InitStack(Stack &s)//初始化
- {
- s.base = (char*)malloc(STACK_INIT_SIZE*sizeof(char));
- if(!s.base)
- exit (OVERFLOW);
- s.top = s.base;
- s.stack_size = STACK_INIT_SIZE;
- }
- char GetTop(Stack S)//取栈顶
- {
- if(S.base != S.top)
- return *(S.top-1);
- }
- void Push(Stack &S, char e)//新元素入栈
- {
- *S.top = e;
- *S.top ++;
- }
- bool StackEmpty(Stack &S)//判断占空
- {
- if(S.base == S.top)
- return false;
- return true;
- }
- bool Pop(Stack &S)//删除栈顶
- {
- if(S.base == S.top)
- return false;
- S.top --;
- return true;
- }
- bool StackCheck(Stack &S)//进行符号配对的判断
- {
- char test[101];
- bool flag=true;
- while(cin>>test)
- {
- if(test[0]=='.'&&test[1]=='\0')//如果一上来就符合结束规定,退出循环
- break;
- for(int i=0;test[i]!='\0';i++)//依次读入程序字符
- {
- if(test[i]=='/'&&test[i+1]=='*')//当读到这俩个符号时,进行入栈操作,i提前一位
- {
- Push(S,test[i]),Push(S, test[i+1]);
- i++;
- }
- else if(test[i]=='(' || test[i]=='{' || test[i]=='[')//当读到括号的前半部分时,仍然入栈
- {
- Push(S,test[i]);
- }
- else if(test[i]==']')
- {
- if(StackEmpty(S)&&GetTop(S)=='[')//当读到】时,判断当前栈内是否有该括号的前半部分并且栈不空,若都成立, test[i]赋值给temp,退出循环
- Pop(S);
- else
- {
- flag=false;
- temp=test[i];
- break;
- }
- }
- else if(test[i]=='}')
- {
- if(StackEmpty(S)&&GetTop(S)=='{')
- Pop(S);
- else
- {
- flag=false;
- temp=test[i];
- break;
- }
- }
- else if(test[i]==')')
- {
- if(StackEmpty(S)&&GetTop(S)=='(')
- Pop(S);
- else
- {
- flag=false;
- temp=test[i];
- break;
- }
- }
- else if(test[i]=='*'&&test[i+1]=='/')
- {
- if(StackEmpty(S)&&GetTop(S))
- {
- Pop(S);
- if(StackEmpty(S)&&GetTop(S)=='/')
- {
- Pop(S);
- }
- else
- {
- flag=false;
- temp=test[i];
- break;
- }
- }
- else
- {
- flag=false;
- temp=test[i];
- break;
- }
- }
- }
- }
- if(!StackEmpty(S)&&flag)
- return true;
- else
- return false;
- }
- int main()
- {
- Stack S;
- InitStack(S);
- if(!StackCheck(S))//根据题目要求,进行输出
- {
- printf("NO\n");
- if(StackEmpty(S))
- {
- if(GetTop(S)=='(')
- printf("(-?\n");
- if(GetTop(S)=='{')
- printf("{-?\n");
- if(GetTop(S)=='[')
- printf("[-?\n");
- if(GetTop(S)=='*')
- printf("/*-?\n");
- }
- else
- {
- if(temp==')')
- printf("?-)\n");
- if(temp=='}')
- printf("?-}\n");
- if(temp==']')
- printf("?-]\n");
- if(temp=='*')
- printf("?-*/\n");
- }
- }
- else
- printf("YES\n");
- }
7-4 表达式转换:
输入样例:
- 2+3*(7-4)+8/4
输出样例:
- 2 3 7 4 - * + 8 4 / +
代码:


- //ceshi
- //2+3*(7-4)+8/4
- #include<stdio.h>
- #include<string.h>
- int Judge_Numeric(char c)//数字处理
- {
- int flag = ((c>='0'&&c<='9'));
- return flag;
- }
- int Judge_ZF(char c)
- {
- int flag = (c=='+' ||c=='-');
- return flag;
- }
- int Judge_CC(char c)
- {
- int flag;
- flag=(c=='*'||c=='/');
- return flag;
- }
- int main()
- {
- char a[31],b[31];
- scanf("%s",a);
- int flag1,flag2=0;
- int j=0;
- int len=strlen(a);
- for(int i=0;i<len;i++)
- {
- flag1=1;
- if(Judge_Numeric(a[i]))
- {
- if(flag2==0||(a[i-1]>='0'&&a[i-1]<='9')||a[i-1]=='.')
- printf("%c",a[i]);
- else
- printf(" %c",a[i]);
- flag2++;
- }
- if(a[i]=='.')
- {
- printf("%c",a[i]);
- }
- if(Judge_ZF(a[i]))
- {
- if(i==0)
- {
- if(a[i]=='-')
- printf("%c",a[i]);
- flag1=0;
- }
- else
- {
- if(a[i-1]=='-'||a[i-1]=='+'||a[i-1]=='*'||a[i-1]=='/'||a[i-1]=='(')
- {
- if(a[i]=='-')
- {
- printf(" %c",a[i]);
- flag2=0;
- }
- flag1=0;
- }
- }
- if(flag1==1)
- {
- if(j==0)
- {
- b[j]=a[i];
- j++;
- }
- else if(b[j-1]=='+'||b[j-1]=='-'||b[j-1]=='(')
- {
- b[j]=a[i];
- j++;
- }
- else if(b[j-1]=='*'||b[j-1]=='/')
- {
- while(j>0)
- {
- if(b[j-1]=='(')
- break;
- printf(" %c",b[j-1]);
- j--;
- }
- b[j]=a[i];
- j++;
- }
- }
- }
- if(Judge_CC(a[i]))
- {
- if(j==0)
- {
- b[j]=a[i];
- j++;
- }
- else if(b[j-1]||b[j-1]=='+'||b[j-1]=='-'||b[j-1]=='(')
- {
- b[j]=a[i];
- j++;
- }
- }
- if(a[i]==')')
- {
- while(j>0)
- {
- if(b[j-1]=='(')
- {
- j--;
- break;
- }
- printf(" %c",b[j-1]);
- j--;
- }
- }
- if(a[i]=='(')
- {
- b[j]=a[i];
- j++;
- }
- }
- while(j>0)
- {
- printf(" %c",b[j-1]);
- j--;
- }
- }
7-5 银行业务队列简单模拟:
输入样例:
- 8 2 1 3 9 4 11 13 15
输出样例:
- 1 3 2 9 11 4 13 15
代码:


- #include<stdio.h>
- int main()
- {
- int a[1001];
- int b[1001];//开辟两个数组,用于存放到两个窗口的人数;
- int N;
- int m = 0, n = 0;
- int flag = 0;
- scanf("%d",&N);
- for(int i = 0; i < N; i++)
- {
- int temp;
- scanf("%d",&temp);
- if(temp % 2 == 0)
- {
- b[n] = temp;
- n ++;
- }
- else
- {
- a[m] = temp;
- m ++;
- }
- }
- int m1 = 0, n1 = 0;
- while(m1 < m || n1 < n)
- {
- if(m1 < m)
- {
- if(flag++)
- {
- printf(" ");
- flag ++;
- }
- printf("%d", a[m1]);
- m1 ++;
- }
- if(m1 < m)
- {
- if(flag++)
- {
- printf(" ");
- //flag ++;
- }
- printf("%d", a[m1]);
- m1 ++;
- }
- if(n1 < n)
- {
- if(flag++)
- {
- printf(" ");
- //flag ++;
- }
- printf("%d", b[n1]);
- n1 ++;
- }
- }
- return 0;
- }
7-6 银行排队问题之单队列多窗口服务:
输入样例:
- 9
- 0 20
- 1 15
- 1 61
- 2 10
- 10 5
- 10 3
- 30 18
- 31 25
- 31 2
- 3
输出样例:
- 6.2 17 61
- 5 3 1
代码:


- #include<stdio.h>
- #include<string.h>
- typedef struct Q{
- int arrive;//到达时间
- int deal;//处理时间
- }Queue;
- Queue q[1010];
- int main()
- {
- //Queue q[1002];
- int head, tail;
- int n;
- int windows;
- int k;
- while(~scanf("%d", &n))
- {
- head = 0;
- tail = 0;//定义头和尾,队列的
- for(int i=0;i<n;i++)
- {
- scanf("%d%d", &q[tail].arrive, &q[tail].deal);//讲数据读入队列
- if(q[tail].deal > 60)
- q[tail].deal = 60;
- tail++;//最大处理时间默认为60
- }
- scanf("%d",&windows);//定义窗口数
- int sum_wait_time=0;//总的等待时间
- int wait_time=0;//最长等待时间
- int wait=0;//个体等待时间
- int finish_time[15]={0};//完成业务的人数
- int windows_num[15]={0};//窗口人数
- while(head < tail)
- {
- int flag=0;//做标记
- int fastest=99999;//最快完成的时间
- int index_fastest=0;//最快完成时间的下标
- for(int j=0;j<windows;j++)//便利整个窗口
- {
- if(finish_time[j]<q[head].arrive)//如果队列首位,到达时间比,完成时间大,就代表不需要等待
- {
- finish_time[j]=q[head].arrive+q[head].deal;//更新时间
- windows_num[j]++;//窗口人数加一
- flag=1;//标记,表示不需要等待
- head++;//剔除首位
- break;
- }
- if(fastest>finish_time[j])//如果需要等待,就记录各个窗口里最快完成的那个窗口的完成时间,和下标
- {
- fastest = finish_time[j];
- index_fastest=j;
- }
- }
- if(!flag)//需要等待
- {
- wait=fastest-q[head].arrive;
- if(wait_time<wait)
- {
- wait_time = wait;
- }
- sum_wait_time+=wait;
- finish_time[index_fastest]=fastest+q[head].deal;
- windows_num[index_fastest]++;
- head++;
- }
- }
- int zuihou=0;
- for(k=0;k<windows;k++)
- {
- if(zuihou<finish_time[k])
- zuihou = finish_time[k];//求最大完成时间
- }
- printf("%.1lf %d %d\n",1.0*sum_wait_time/n,wait_time,zuihou);//输出,平均等待时间, 最长等待时间, 最后完成时间
- for(int i=0;i<windows;i++)
- {
- printf("%d",windows_num[i]);//输出各个窗口的人数
- if(i==windows-1)
- printf("\n");
- else
- printf(" ");
- }
- }
- return 0;
- }
7-7 列车调度:
输入样例:
- 9
- 8 4 2 5 3 9 1 6 7
输出样例:
- 4
代码:


- #include<bits/stdc++.h>
- using namespace std;
- int arr[100001];//开辟数组并赋值
- int main()
- {
- int n;
- scanf("%d",&n);
- //int arr[100001]={0};//开辟数组并赋值
- int a;
- int total=0;
- for(int i=0;i<n;i++)
- {
- scanf("%d",&a);
- if(total==0||arr[total-1]<a)//当前车辆比前面车辆大,开辟一条新路
- {
- arr[total++] = a;
- //total ++;
- }
- else//当前车辆比前面车辆xiao,进一步判断跟前面的车还是跟其他比他大的车
- {
- int head=0, tail=total-1;
- int mid;
- while(head<tail)//二分查找,找大于该车的车号最小的车
- {
- int mid=head+(tail-head)/2;
- if(arr[mid]==a)
- break;
- else if(arr[mid]>a)
- tail=mid-1;
- else
- head=mid+1;
- }
- arr[head] = a;
- }
- }
- printf("%d",total);
- return 0;
- }
SDUST数据结构 - chap3 栈和队列的更多相关文章
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- python数据结构之栈、队列的实现
这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...
- PHP数据结构:栈、队列、堆、固定数组
数据结构:栈 队列: 堆: 固定尺寸的数组:
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
- 数据结构之栈和队列及其Java实现
栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...
- python——python数据结构之栈、队列的实现
这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...
- JS数据结构的栈和队列操作
数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...
随机推荐
- Sentinel Dashboard(基于1.8.1)流控规则持久化到Nacos——涉及部分Sentinel Dashboard源码改造
前言 之前虽然也一直在使用sentinel实现限流熔断功能,但却没有好好整理之前看的源码与资料,今天有时间将之前自己整理过的资料写成一篇博文,或者是是一篇关于Sentinel(基于目前最近版本1.8, ...
- c预处理和宏
文件的预处理 #include "xxx.h" 1 首先查找当前源文件所在的路径 2 查找工程的头文件搜索路径 #include <xxxx.h> 查找工程的头文件搜索 ...
- 拒绝造轮子!如何移植并使用Linux内核的通用链表(附完整代码实现)
在实际的工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典的双向链表 list_head.本篇文章详细介绍了Linux内核的通用链表是如何实现的,对于经常使 ...
- js上 八.语句
1.什么是语句 概念:在JavaScript中表达式是短语,语句就是整句或命令. 作用:用来执行以使某件事发生 特征:用 ; 结尾 Js中语句的常见形式: ü 表达式语句 ü 复合语句 ü 声明语句 ...
- 配合php伪协议利用文件包含漏洞
文章来源: https://blog.csdn.net/zpy1998zpy/article/details/80598768?utm_medium=distribute.pc_relevant.no ...
- Docker 在搭建私有仓库配置镜像时候报错
今天搞私有镜像报了个错 ,看了,好久原来是 多了个空格 服务失败,因为控制进程退出时带有错误代码.参见"systemctl状态docker".详细信息参见"服务" ...
- 我用 go-zero 一周实现了一个中台系统,已开源!
作者:Jack 最近发现golang社区里出了一个新星的微服务框架,来自好未来,光看这个名字,就很有奔头,之前,也只是玩过go-micro,其实真正的还没有在项目中运用过,只是觉得 微服务,grpc ...
- 无法启动IIS Express Web服务器
解决 打开项目文文件夹以.csproj结尾的文件),找到WebProjectProperties节点然后,将图中框选的三项节点内容全部清空 删除.vs 重新启动即可
- Core3.0发布到IIS的流程
前言 参考链接 https://www.cnblogs.com/wutongjun/p/11981798.html 在IIS上部署 .Net Core 3.0 项目的主要流程有: 安装并启用IIS 安 ...
- Sentinel并发限流不精确-之责任链
在之前调研Sentinel的过程中,为了准备分享内容,自己就简单的写了一些测试代码,不过在测试中遇到了一些问题,其中有一个问题就是Sentinel流控在并发情况下限流并不精确,当时我还在想,这个我 ...