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数据结构的栈和队列操作
数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...
随机推荐
- JWT 注册登录
1.JWT安装配置 pip install djangorestframework-jwt==1.11.0 1.2 syl/settings.py 配置jwt载荷中的有效期设置 # jwt载荷中的有效 ...
- mysql主从同步错误
一.主从同步报错 mysql> show slave status\G; *************************** 1. row ************************* ...
- 环境篇:Atlas2.1.0兼容CDH6.3.2部署
环境篇:Atlas2.1.0兼容CDH6.3.2部署 Atlas 是什么? Atlas是一组可扩展和可扩展的核心基础治理服务,使企业能够有效地满足Hadoop中的合规性要求,并允许与整个企业数据生态系 ...
- SQL注入练习第一天
MySQL 相关知识 在MySQL中,把[INFORMATION_SCHEMA] 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的 ...
- 点击劫持(Iframe clickJack)练习
实验内容: 寻找一个合适的网站放入到iframe标签中.实验中测试了包括知网首页及登录界面.淘宝首页及登录界面,百度首页,微信下载界面.发现淘宝登录界面无法放入,会直接跳转到淘宝真实的登录界面,其他的 ...
- Linux系统搭建RabbitMQ
下载erlang和rabbitmq-server 1.下载Erlang安装包 [root@VM_0_9_centos soft]# wget http://erlang.org/download/ot ...
- Python小白干货宝典:sorted()函数:列表元素排序
定义: sorted() 函数对所有可迭代的对象进行排序操作. 内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作. 语法: sorted 语法: sorted(i ...
- python解压可迭代对象赋值给多个变量
如果一个可迭代对象的元素个数超过了变量的个数,会出现"解压值太多"的异常,python提供*号表达式(码夫破石的理解)来解决. 1,求一组平均值,就以类似学生成绩为例,要求是去掉第 ...
- 1.Redis基础命令
重要概念 redis是单线程模型,所有命令都会进入一个队列,然后依次被执行. 全局命令 >>>select dbindex #切换数据库,默认有16个库,库标识符为0-15 > ...
- [每日一题]ES6中为什么要使用Symbol?
关注「松宝写代码」,精选好文,每日面试题 加入我们一起学习,day day up 作者:saucxs | songEagle 来源:原创 一.前言 2020.12.23日刚立的flag,每日一题,题目 ...