数据结构 栈&队列
2-4
依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( )
删除,移动头指针;
增加,移动尾指针;
删除a,b ,队头c
2-3
在一个链队列中,front和rear分别为头指针和尾指针,则插入一个结点s的操作为( )
这道题目,我坚持自己的答案,就是这个答案!
2-1
若用大小为6的数组来实现循环队列,且当前front
和rear
的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,front
和rear
的值分别为多少?
删除,front++
增加,rear++
是 2 和 6,循环队列 6%6=0
2 和 0
如果循环队列用大小为m
的数组表示,队头位置为front
、队列元素个数为size
,那么队尾元素位置rear
为
元素个数size = (rear-front+m)%m+1;
由此可得,rear = (size+front-1)%m;
编程题答案在我其他博客里,直接在侧栏搜索就行
代码:
设一个堆栈的入栈顺序是1、2、3、4、5。若第一个出栈的元素是4,则最后一个出栈的元素必定是:
设一个栈的输入序列是1、2、3、4、5,则下列序列中,是栈的合法输出序列的是?
解读下A:
1.压入 1 2 3
2.弹出 3 2 1
3.压入 4 5
4.弹出 5 4
出栈顺序就是 3 2 1 5 4,成立,别的也可以用相同的方式进行分析;
将5个字母ooops
按此顺序入栈,则有多少种不同的出栈顺序可以仍然得到ooops
?
可以看出,最后两个ps都是压入后就弹出的,所以就是研究 ooo的弹出组合;
ooo
队列&栈函数题(只补充之前博客里没有的)
- 堆栈操作合法性( 分) 假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。 输入格式: 输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。 输出格式: 对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。 输入样例: SSSXXSXXSX SSSXXSXXS SSSSSSSSSSXSSXXXXXXXXXXX SSSXXSXXX 输出样例: YES NO NO NO ---------------------------------------------------------------------- #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <iostream> #define EXP_STACK 50 #define ERROR -1 #define OK 1 using namespace std; typedef int Elemtype; typedef int Status; ; int STACK_SIZE; typedef struct { Elemtype *base; Elemtype *top; int sta_len; int ElemNumber; }Stack; Status InitStack(Stack &Sta) { Sta.base = (Elemtype *)malloc(STACK_SIZE*sizeof(Elemtype)); ; Sta.top = Sta.base; Sta.sta_len = STACK_SIZE; Sta.ElemNumber = ; } Status GetTop(Stack sta,Elemtype &e) { if(sta.top==sta.base) return ERROR; e = *(sta.top-); return OK; } Status Push(Stack &S,Elemtype e) { if(S.top-S.base>=S.sta_len) { S.base = (Elemtype *)realloc(S.base,(EXP_STACK+S.sta_len)*sizeof(Elemtype)); S.sta_len+=EXP_STACK; } *S.top++ = e; S.ElemNumber+=; return OK; } Status Pop(Stack &S) { if(S.top==S.base) return ERROR; --S.top; S.ElemNumber--; return OK; } int main() { int cases; int Len; scanf("%d%d",&cases,&Len); STACK_SIZE = Len; while(cases--) { ]; scanf("%s",opr); int len = strlen(opr); Stack Sta; InitStack(Sta); //cout<<Sta.sta_len<<" "<<Sta.ElemNumber<<endl; bool Fits = true; ;i<len;i++) { if(opr[i]=='S') { if(Sta.ElemNumber==Len) { Fits = false; break; } Push(Sta,); } else if(opr[i]=='X') { int Ans = Pop(Sta); ) { Fits = false; break; } } } if(Sta.ElemNumber) Fits = false; if(Fits) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
堆栈操作合法性
- 符号配对( 分) 请编写程序检查C语言源程序中下列符号是否配对:/*与*/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。 输出格式: 首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。 输入样例1: void test() { ]; ; i<; 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 ]; ; i<; i++) /**/ A[i] = 0.1*i; } . 输出样例3: YES -------------------------------------------------------------------- #include<cstdio> #include<iostream> #include<cmath> #include<malloc.h> #include<stdlib.h> #include<string.h> #include<cstring> #define STACK_INIT_SIZE 10000 #define STACKINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 using namespace std; typedef char SElemType,Status; typedef struct { SElemType *base; SElemType *top; int stacksize; } Stack; Status InitStack(Stack &S) { S.base=(SElemType *)malloc(sizeof(SElemType)*STACK_INIT_SIZE); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status Push(Stack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)malloc(sizeof(SElemType)*(S.stacksize+STACKINCREMENT)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return OK; } Status Pop(Stack &S) { if(S.top==S.base) return ERROR; S.top--; return OK; } Status GetTop(Stack &S,SElemType &e) { if(S.base==S.top) return ERROR; e=*(S.top-); return OK; } +; char s[maxn]; bool Find(Stack &S,char ch) { char tmp[maxn]; memset(tmp,'\n',sizeof(tmp)); ; while(S.top!=S.base) { SElemType e2; GetTop(S,e2); if(e2==ch) { Pop(S); ; i>=; i--) Push(S,tmp[i]); return true; } else { tmp[num++]=e2; } Pop(S); } ; i>=; i--) Push(S,tmp[i]); return false; } void judge(char ch) { if(ch=='(') printf("(-?\n"); else if(ch=='[') printf("[-?\n"); else if(ch=='{') printf("{-?\n"); else if(ch=='<') printf("/*-?\n"); } int main() { Stack Sta; InitStack(Sta); ; while(gets(s)) { ]=='.') break; int len=strlen(s); ;i<strlen(s);i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') Push(Sta,s[i]); ]==<len) { ++i; Push(Sta,'<'); } else if(s[i]==')') { if(Sta.top!=Sta.base) { SElemType e; GetTop(Sta,e); if(e=='(') Pop(Sta); else if(flag) { printf("NO\n"); flag=; judge(e); } } else if(flag) { flag=; printf("NO\n"); printf("?-)\n"); } } else if(s[i]==']') { if(Sta.top!=Sta.base) { SElemType e; GetTop(Sta,e); if(e=='[') Pop(Sta); else if(flag) { printf("NO\n"); flag=; judge(e); } } else if(flag) { flag=; printf("NO\n"); printf("?-]\n"); } } else if(s[i]=='}') { if(Sta.top!=Sta.base) { SElemType e; GetTop(Sta,e); if(e=='{') Pop(Sta); else if(flag) { printf("NO\n"); flag=; judge(e); } } else if(flag) { flag=; printf("NO\n"); printf("?-}\n"); } } ]==<len) { ++i; if(Sta.top!=Sta.base) { SElemType e; GetTop(Sta,e); if(e=='<') Pop(Sta); else if(flag) { printf("NO\n"); flag=; judge(e); } } else if(flag) { flag=; printf("NO\n"); printf("?-*/\n"); } } } } if(flag) { if(Sta.base==Sta.top) printf("YES\n"); else { SElemType e; GetTop(Sta,e); printf("NO\n"); judge(e); } } }
符号配对
简单的递归策略非常好理解:
只用一个题举例子:
double P( int n, double x ) { if(n==0) return 1; // 条件一 else if(n==1) return x;//条件二 else if(n>1) { return ((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;//条件三 } }
这就是根据条件和参数还原一下;
Made by Kindear
数据结构 栈&队列的更多相关文章
- 数据结构之队列and栈总结分析
一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的 ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- Java 容器之 Connection栈队列及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- C++ 泛型 编写的 数据结构 栈
平时编程里经常需要用到数据结构,比如 栈和队列 等, 为了避免每次用到都需要重新编写的麻烦现将 C++ 编写的 数据结构 栈 记录下来,以备后用. 将 数据结构 栈 用头文件的形式 ...
- java面向对象的栈 队列 优先级队列的比较
栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...
- JavaScript数据结构——栈的实现与应用
在计算机编程中,栈是一种很常见的数据结构,它遵从后进先出(LIFO——Last In First Out)原则,新添加或待删除的元素保存在栈的同一端,称作栈顶,另一端称作栈底.在栈中,新元素总是靠近栈 ...
- javascript数据结构之队列
首先什么是队列? 排队买东西就是生活中队列的实际例子,在队伍中大家必须按照顺序来,不能插队,新来的人只能排在队伍的最后面.新加入的人相当于队列的后端加入的元素,队伍最前面买完东西的人离开队伍相当于是队 ...
- 栈 & 队列
栈 先进者后出,后进者先出,LIFO,典型的"栈"结构 从栈的操作特性上来看,栈是一种"操作受限"的线性表,只允许在一段插入和删除数据. 在功能上来说,数组和链 ...
随机推荐
- Electron的代码调试
刚接触Electron,尝试调试程序时,竟无从下手,所以把这个过程做了下记录 参考工程 根据Electron的官方文档:使用 VSCode 进行主进程调试:https://electronjs.org ...
- openssl几个加密算法使用介绍
1.openssl简介 1)openssl概述 OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. ...
- 单点登录实现机制:桌面sso
参考链接,感谢作者:https://zm10.sm-tc.cn/?src=l4uLj8XQ0IiIiNGckZ2TkJiM0ZyQktCZlo2Mi5uNmp6S0I/QysrJyszPztGXi5K ...
- 在ABPZERO中,扩展实体的方法。
内容 介绍 扩展的抽象实体 将新属性添加给用户 添加迁移 在界面上显示地址 在用户编辑/添加功能中添加地址 扩展的非抽象类实体 获得版本的派生实体 添加迁移 在界面上添加价格 在创建/编辑版本功能中加 ...
- 您的 Java 代码安全吗 — 还是暴露在外? 【转】
在开发 Java Web 应用程序时,您需要确保应用程序拥有完善的安全性特征补充.这里在谈到 Java 安全性时,我们并不谈及 Java 语言提供的安全性 API,也不涉及使用 Java 代码来保护应 ...
- java集合小知识的复习
*Map接口 Map<k,v>接口中接收两个泛型,key和value的两个数据类型 Map中的集合中的元素都是成对存在的每个元素由键与值两部分组成,通过键可以找对所对应的值.值可以重复,键 ...
- python网络编程基础(一)
一.C/S架构 客户端/服务端架构 二.OSI七层架构 七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机 ...
- jq中的表单验证插件------jquery.validate
今天我们来说一下表单验证,有人说我们在进行表单验证的时候使用正则来验证是非常麻烦的,现在我来给大家介绍一下表单验证的插件:jquery.validate.min.js 它是与jquery一起结合用来使 ...
- Hibernate(八):基于外键映射的1-1关联关系
背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1 ...
- 框架学习之Spring(一IOC)----HelloWrod
一.概述 Spring是一个开源框架,它的核心是控制反转(IOC)和面向切面(AOP).简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架. EE 开发分 ...