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数据结构的栈和队列操作
数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...
随机推荐
- js下 Day13、面向对象
一.对象 什么是对象: 一组无序的属性集合 创建对象两种方式: 对象字面量: var obj = {} 实例化: var obj = new Object() 对象取值: **[] ( ** 中括号) ...
- Java之String重点解析
String s = new String("abc")这段代码创建了几个对象呢?s=="abc"这个判断的结果是什么?s.substring(0,2).int ...
- Ch2信息的表示和处理——caspp深入理解计算机系统
目录 第2章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制 一.表示法 二.加减 三.进制转换 2.1.2 字 2.1.3 数据大小 2.1.4 字节顺序与表示 一.字节的排列规则 二.打 ...
- 如何正确运用break、continue和return
break.continue和return 一.break 作用:跳出(离break语句最近的)循环 栗子: for(int i = 1;i <= 100;i++){ System.out.pr ...
- 超简单的 Docker部署 SpringBoot项目 步骤
很久之前就用过,一直没有好好写篇博客,今天就总结一下 创建一个 SpringBoot项目 创建一个SpringBoot项目并打成jar包,结构如图 编写 Dockerfile文件 FROM java: ...
- 物联网打工人必备:LiteOS Studio图形化调测能力
摘要:本文会给大家介绍下LiteOS Studio的调测的几个知识点,包括: 调测配置,监视变量,反汇编代码同步展示,数值进制切换,跨平台编译调测,Qemu模拟器调测,多核调测,远程设备调测等. 掌握 ...
- 闲鱼上哪些商品抢手?Python 分析后告诉你
1目 标 场 景 经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能,都能为他们带来不错的 睡后收入. 闲鱼上大量的商品,很难精准判断哪些受欢迎,哪些好卖:一个个录入数据去做数据分析,浪费时间的同 ...
- python简单的函数应用
一个简单的函数应用,包括自定义函数,lambda函数,列表解析. 1 #!usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 4 #开始定义函数 5 def ...
- HCIP --- BGP实验
实验拓扑: 要求: R1.R2是EBGP关系,R2.R4是IBGP关系,R4.R5是EBGP邻居关系 R1与R5的环回可以通信 1.配置IP地址 2.BGP承载与IGP之上,所以给AS 2 启用IGP ...
- LINQ to Entities 不识别方法“System.String ToString(“yyyy-MM-dd”)”
将Queryable转化为IEnumerable或者直接Tolist()