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数据结构的栈和队列操作
数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...
随机推荐
- 用列表+for循环生成乘法口诀表
1 # 结合一下列表生成, 准备设计乘法表 2 # numlist = [1,2,3,4,5] 3 # [pow(i,3) for i in numlist] 4 # ## [1, 8, 27, 64 ...
- 七、Jmeter测试元件-线程
线程组元素是任何测试计划的起点.所有控制器和采样器必须在线程组下.其他元素(例如,侦听器)可以直接放置在测试计划下. 名称:相当于一个业务流程 继续:当取样器出错时 会继续请求: 举例:1-当一个线程 ...
- Nginx(三):反向代理,负载均衡
环境准备 配置反向代理,负载均衡,动静分离需要的必备环境,JDK,2个tomcat开启8080和8081端口. 安装jdk [root@localhost ~]# rpm -qa|grep jav ...
- Spark-2-性能监控方式
1 Spark Web UI Spark提供了一些基本的Web监控页面,对于日常监控十分有用. 通过http://master:4040(默认端口是4040,可以通过spark.ui.port修改)我 ...
- 从苹果BigSur官网学点东西
从苹果BigSur官网学点东西 Awsome配色 这个 蓝紫渐变大底 + 简洁的 矩形状字块 + 粗细层次字形,看着就蛮舒服. 看看css配色: .section-hero div[data-comp ...
- 【剑指offer】02 替换空格
题目地址:替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We ...
- 1.k8s概述、安装、名词解释、资源清单
一.k8s概述 1.简介 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernete ...
- Win10-1909删除自带的微软输入法,添加美式键盘
删除自带 输入法切换
- 从数据库将数据导出到excel表格
public class JxlExcel { public static void main(String[] args) { //创建Excel文件 String[] title= {" ...
- IDEA和eclips工具对比
描述 eclipse idea 在当前类查找方法 ctrl+o ctrl+F12 查找文件 ctrl+shift+N 大小写转换 ctrl+shift+X ctrl+shift+Y ctrl ...