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数据结构的栈和队列操作
数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...
随机推荐
- [日常摸鱼]poj2417 DiscreteLogging-BSGS算法
在这题TLE了一天-T_T BSGS裸题-不知道为什么一直挂 第二天(也就是今天)换成黄学长博客里的写法就过掉了 题意:解关于$x$的方程:$a^x \equiv b \pmod{p}$,$p$为质数 ...
- Promise对象,究竟为何物?
Promise对象 一.什么是Promise? Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来. Promise避免了多级异步操作的回 ...
- Python 进阶——如何正确使用 yield?
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 在 Python 开发中, yield 关键字的使用其实较为频繁,例如大集合的生成,简化代码结构.协 ...
- Guns自动化生成代码使用
一.Guns简介 Guns基于Spring Boot2,致力于做更简洁的后台管理系统.包含系统管理,代码生成,多数据库适配,SSO单点登录,工作流,短信,邮件发送,OAuth2登录,任务调度,持续集成 ...
- [译] 使用 Espresso 隔离测试视图
原文地址:Testing Views in Isolation with Espresso 原文作者:Ataul Munim 译文出自:掘金翻译计划 译者:yazhi1992 校对者:lovexiao ...
- 表单序列化json字符串和js时间格式化
js时间格式化 new Date().format("时间格式") Date.prototype.format = function(fmt) { var o = { ...
- 拖拽一个元素如此简单,mouse、drag、touch三兄弟的用处
最近需要做一个投票活动,上传图片时需要拖拽.缩放来裁剪图片,vue的组件不少,不过自己动手才能丰衣足食,一味使用别人的组件实在难以进步,所以自己研究一番. 一.mouse.drag.touch傻傻分不 ...
- 远程桌面连接(出现身份验证错误。要求的函数不支持)这可能由于CredSSP加密Oracle修正。
家庭版解决方案 在进行远程桌面时会遇到这种情况.对于Windows 10家庭版用户,是不支持组策略功能的.本文根据官方文档采用修改注册表的方式达到相同的目的. 1.打开注册表 win + R 键 ...
- Python错误重试方法
前言 Tenacity是一个 Apache 2.0授权的通用重试库,用 Python 编写,用于简化向几乎所有内容添加重试行为的任务.它起源于一个重新尝试的分支,可惜这个分支已经不复存在了. 使用Te ...
- hive 将hive表数据查询出来转为json对象和json数组输出
一.将hive表数据查询出来转为json对象输出 1.将查询出来的数据转为一行一行,并指定分割符的数据 2.使用UDF函数,将每一行数据作为string传入UDF函数中转换为json再返回 1.准备数 ...