判断出栈顺序的合法性

”栈“是一种限制性线性表,是将线性表的插入、删除操作限制为仅在表的一端进行,一般将能够插入、删除的一端称为栈顶,表的另一端称为栈底。当栈中没有元素时称为空栈。即就是将每次进栈的元素放在栈顶元素之上而称为新的栈顶,而每次出栈的是当前栈中“最新”的元素。因此就需要对一些出栈顺序的合法性进行判断。这个也是面试会经常问到的问题。

◆主要思路:

首先,需要一个栈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

判断出栈顺序的合法性(面试题)相关推荐

  1. 【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 ...

  2. 根据入栈顺序判断出栈顺序的合法性

    这道题不管是面试还是笔试的选择题都非常爱出的一道题 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4 ...

  3. 判断出栈顺序合法性的两种方法

    文章目录 今天偶然看到一个面试题, 题目是这样的: 给我们两个序列,第一个序列表示栈的压入顺序,然后让判断第二个序列是不是是否是该栈的弹出序列 现设第一个序列为[1,2,3,4,5],第二个序列为[3 ...

  4. java判断出栈顺序,java判断出栈顺序是否正确

    java判断出栈顺序是否正确 我们知道栈是一种先进后出的数据容器.当一个栈的输入序列是递增序列(例如a,b,c,d),并且在进栈操作时,允许退栈操作,则输出的序列可能有多种形式(例如:d,c,b,a或 ...

  5. 判断出栈顺序是否正确

    先说一下题目: 假设有一个栈S,每次我们可以把序列A(含N个元素)中的第一个元素移入栈S,也可以是从栈顶弹出一个元素放入出栈序列B.这 样,经过N次入栈和出栈操作后,我们可以得到一个出栈序列B. 现在 ...

  6. 根据入栈顺序判断出栈顺序是否合理

    def is_pop_order(push, pop):"""根据入栈顺序判断出栈顺序是否合理:param push: 入栈顺序:param pop: 出栈顺序:retu ...

  7. 阿雪的学习记录|手动快速判断出栈顺序是否合法的万能方法

    做了好多次笔试题了每次遇到这个就一头雾水,今天静下心来捉摸了一下,用不编程的方法手动快速判断. 判断方法:在出栈的队列中,排在某元素x后面(右侧)的元素中,在入栈队列里在该元素x前面(左侧)的元素按照 ...

  8. 023 判断出栈顺序是否正确

    1.题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序. 假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...

  9. java判断出栈顺序,Java判断出栈顺序是不是正确的方法

    我们知道栈是一种先进后出的数据容器.当一个栈的输入序列是递增序列(例如a,b,c,d),并且在进栈操作时,允许退栈操作,则输出的序列可能有多种形式(例如:d,c,b,a或a,c,b,d等).但是却肯定 ...

最新文章

  1. mysql二进制日志文件差不多_mysql数据同步-基于二进制日志文件和position复制点的方式...
  2. win7多国语的安装说明
  3. 如何判断浏览器的请求头是不是结束
  4. 【干货】用痛点切入,用痒点黏住
  5. c++类与类的关联(Association)关系
  6. ORA-01172,ORA-01151
  7. 【Uva - 10047 】The Monocycle(搜索,bfs记录状态)
  8. vue rules 两个输入框不能相等_Vue 学习笔记(二十五):webpack 相关
  9. openpyxl使用
  10. synchronized-锁总结
  11. ATSC/DVB/ISDB三大标准比较
  12. 《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者
  13. [python][turtle]闪瞎眼的晶体管报时
  14. 股票交易日志3 12.15
  15. 关于黑苹果卡在[IGPU] Scheduler Throttle Cap=100ms的解决办法
  16. 转载 真正解决activesync与wince5连接问题
  17. 干货!#黑客大会PPT资源#,快来领取吧!
  18. 手持式尘埃粒子测试仪价格,尘埃粒子一般一个点测量几次
  19. 递推数列【清华大学】
  20. iOS 获取手机外网IP地址的成功与失败

热门文章

  1. Redis支持的5种数据类型
  2. Android10.0 startActivity启动过程
  3. 【Gradle】借助gradle的ProductFlavor实现多App间代码库复用
  4. python内置函数调用前_python之内置函数(一)
  5. scratch小游戏脚本大全_酷酷带你一起做小游戏--跳一跳
  6. Simple print, much secret
  7. Bootstrap部分---环境安装及一个可视化的布局;
  8. (七)渐变 矩形渐变 放射渐变
  9. 新上映的电影不在影院也一样能看到
  10. Oracle排序中NULL值处理的五种常用方法