判断出栈顺序的合法性(面试题)
判断出栈顺序的合法性
”栈“是一种限制性线性表,是将线性表的插入、删除操作限制为仅在表的一端进行,一般将能够插入、删除的一端称为栈顶,表的另一端称为栈底。当栈中没有元素时称为空栈。即就是将每次进栈的元素放在栈顶元素之上而称为新的栈顶,而每次出栈的是当前栈中“最新”的元素。因此就需要对一些出栈顺序的合法性进行判断。这个也是面试会经常问到的问题。
◆主要思路:
首先,需要一个栈s,给定两个序列,先将入栈序列的第一个数据与出栈序列的第一个数据相比较,若两个数据相同,再次将入栈序列的第二个数据和出栈序列的第二个数据进行比较,若两个数据不相同将入栈序列中的第一个数据压入s栈中,再次比较入栈序列的第二个数据和出战序列的第一个数据,若相同则继续比较两个序列中的下一个数据,若不相同再将入栈序列的第二个数据压入栈s中,同时重复执行上述的操作比较两个数据。当入栈序列遍历完成后,栈s为空,则出栈序列的顺序是合理的,否则,就是不合理的。
下面是简要的图示:
下面是具体的程序代码:
//判断出栈、入栈的合法性?
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <assert.h>
#include <stack>template<class T>
class IsLegal
{
public:IsLegal(const T* s1, const T* s2) //构造函数:str1(new T[strlen(s1)]), str2(new T[strlen(s2)]){strcpy(str1, s1);strcpy(str2, s2);}~IsLegal() //析构函数{if (str1 != NULL){delete str1;}if (str2 != NULL){delete str2;}} public:void judge(const T* str1, const T* str2){assert(str1);assert(str2);stack<T> s1;while (*str1 != '\0'){if (*str1 != *str2){s1.push(*str1);str1++;}else if (*str1 == *str2){s1.push(*str1);while (!s1.empty()){if (s1.top() != *str2) //防止情况12345——43565{break;}s1.pop();str2++;}str1++;str2++;}}if (*str2 == '\0'){cout << "This is legal." << endl;}else{cout << "This is unlegal." << endl;}}private:T* str1;T* str2;
};int main()
{char* str1 = "12345";char* str2 = "45321";IsLegal<char> s(str1, str2);s.judge(str1, str2);system("pause");return 0;
}
转载于:https://blog.51cto.com/10740590/1764298
判断出栈顺序的合法性(面试题)相关推荐
- 【PAT甲】1051 Pop Sequence (25分)判断出栈顺序的合法性
problem 1051 Pop Sequence (25分) Given a stack which can keep M numbers at most. Push N numbers in th ...
- 根据入栈顺序判断出栈顺序的合法性
这道题不管是面试还是笔试的选择题都非常爱出的一道题 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4 ...
- 判断出栈顺序合法性的两种方法
文章目录 今天偶然看到一个面试题, 题目是这样的: 给我们两个序列,第一个序列表示栈的压入顺序,然后让判断第二个序列是不是是否是该栈的弹出序列 现设第一个序列为[1,2,3,4,5],第二个序列为[3 ...
- java判断出栈顺序,java判断出栈顺序是否正确
java判断出栈顺序是否正确 我们知道栈是一种先进后出的数据容器.当一个栈的输入序列是递增序列(例如a,b,c,d),并且在进栈操作时,允许退栈操作,则输出的序列可能有多种形式(例如:d,c,b,a或 ...
- 判断出栈顺序是否正确
先说一下题目: 假设有一个栈S,每次我们可以把序列A(含N个元素)中的第一个元素移入栈S,也可以是从栈顶弹出一个元素放入出栈序列B.这 样,经过N次入栈和出栈操作后,我们可以得到一个出栈序列B. 现在 ...
- 根据入栈顺序判断出栈顺序是否合理
def is_pop_order(push, pop):"""根据入栈顺序判断出栈顺序是否合理:param push: 入栈顺序:param pop: 出栈顺序:retu ...
- 阿雪的学习记录|手动快速判断出栈顺序是否合法的万能方法
做了好多次笔试题了每次遇到这个就一头雾水,今天静下心来捉摸了一下,用不编程的方法手动快速判断. 判断方法:在出栈的队列中,排在某元素x后面(右侧)的元素中,在入栈队列里在该元素x前面(左侧)的元素按照 ...
- 023 判断出栈顺序是否正确
1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...
- java判断出栈顺序,Java判断出栈顺序是不是正确的方法
我们知道栈是一种先进后出的数据容器.当一个栈的输入序列是递增序列(例如a,b,c,d),并且在进栈操作时,允许退栈操作,则输出的序列可能有多种形式(例如:d,c,b,a或a,c,b,d等).但是却肯定 ...
最新文章
- mysql二进制日志文件差不多_mysql数据同步-基于二进制日志文件和position复制点的方式...
- win7多国语的安装说明
- 如何判断浏览器的请求头是不是结束
- 【干货】用痛点切入,用痒点黏住
- c++类与类的关联(Association)关系
- ORA-01172,ORA-01151
- 【Uva - 10047 】The Monocycle(搜索,bfs记录状态)
- vue rules 两个输入框不能相等_Vue 学习笔记(二十五):webpack 相关
- openpyxl使用
- synchronized-锁总结
- ATSC/DVB/ISDB三大标准比较
- 《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者
- [python][turtle]闪瞎眼的晶体管报时
- 股票交易日志3 12.15
- 关于黑苹果卡在[IGPU] Scheduler Throttle Cap=100ms的解决办法
- 转载 真正解决activesync与wince5连接问题
- 干货!#黑客大会PPT资源#,快来领取吧!
- 手持式尘埃粒子测试仪价格,尘埃粒子一般一个点测量几次
- 递推数列【清华大学】
- iOS 获取手机外网IP地址的成功与失败