判断出栈序列是否可能是某个入栈序列的出栈序列,C++

主要思想栈必须满足先进后出的规则,例如:

压入序列1,2,3,4,5

出栈序列4,3,5,1,2

设定一个Max值代表目前已经出栈的压入序列索引号最大的值

如当4出栈的时候,目前Max是4,当3出栈的时候,就查看3,4是否出栈,如果出栈就正确

当1出栈的时候,目前Max是5,就查看1~5时候出栈,这时候2还没有出栈就认为这个出栈序列不符合先进后出

#include<iostream>
#include<map>
#include<vector>
#include<memory.h>
using namespace std;
class Solution {
map<int,int> inMap;
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int max = 0;
//出栈序列和入栈序列个数不相等
if (popV.size() != pushV.size())
{
return false;
}
if (popV.size() == 0)
{
return true;
}
//当出栈序列和入栈序列个数一样大的时候,两个栈的元素相等就是对的
if (popV.size() == 1)
{
if (popV[0] != pushV[0])
{
return false;
} else {
return true;
}
}
if (popV.size() == 2)
{
if ((popV[0] ==pushV[0] && popV[1] == pushV[1]) ||( popV[0] == pushV[1] && pushV[0] == popV[1]))
{
return true;
} else {
return false;
}
}
for (int i = 0;i < pushV.size();i++)
{
inMap.insert(map<int,int>::value_type(pushV[i],i));
}
bool array[pushV.size()];
memset(array, false, sizeof(array));
int one = inMap.find(popV[0])->second;
int two = inMap.find(popV[1])->second;
array[one] = true;
array[two] = true;
if (one > two)
{
max = one;
} else {
max = two;
}
for (int i = 2;i< popV.size();i++)
{
map<int,int>::iterator currentIndex = inMap.find(popV[i]);
//currentIndex->first是key
if (currentIndex->second > max)
{
max = currentIndex->second;
}
array[currentIndex->second] = true;
for (int j = currentIndex->second; j <= max; j++)
{
if (array[j] == false)
{
return false;
}
}
}
return true;
}
};
int main()
{
int inArray[5] = {1,2,3,4,5};
int outArray[5] = {4,5,3,2,1};
//int outArray[5] = {4,3,5,1,2};
vector<int> pushV = vector<int>(&inArray[0], &inArray[5]);
vector<int> popV = vector<int>(&outArray[0], &outArray[5]);
for (int i = 0;i <pushV.size() ;i++)
{
cout<<pushV[i];
}

cout<<endl;
Solution solution = Solution();
cout<<solution.IsPopOrder(pushV, popV);
return 0;
}

时间: 2024-11-15 20:21:21

判断出栈序列是否可能是某个入栈序列的出栈序列,C++的相关文章

元素出栈,入栈顺序的合法性。如入栈的序列(1,2,3,4,5)。出栈序列为(4,5,3,2,1)

元素出栈,入栈顺序的合法性.如入栈的序列(1,2,3,4,5).出栈序列为(4,5,3,2,1) 思路: 1)如果当前栈为空,且入栈序列不空,则入栈序列的下一个元素入栈: 2)如果当前辅助栈的栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,直到入栈序列为空. 3)如果当前辅助栈的栈顶元素等于出栈序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走: 4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的. 下面用图说明 开始栈为空 入栈序列第一个元素入栈后

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:7_2判断两个单链表是否相交,若相交,求出第一个交点. 题目分析: 创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成

实现一个栈,并且实现一个min函数用来找当前栈中最小的元素

题目描述:实现一个栈,并且实现一个min函数用来找当前栈中最小的元素 分析:要找到栈中最小的元素,需要借助一个辅助栈,来存放当前栈中最小的元素. 入栈的时候,第一个入栈的元素,也给辅助栈入栈,此后每次入栈的元素先与辅助栈的栈顶元素比较,如果小于或等于辅助栈的栈顶元素,则同时将该元素给辅助栈入栈. 如下图所示: 出栈的时候,如果栈顶元素与辅助栈栈顶的元素相等,则同时对辅助栈进行出栈操作 如下图所示: 这样就可以保证,辅助栈中的栈顶元素始终是当前栈中最小的元素了 代码如下: #include<ios

栈的C++实现(数组)——创建-push-pop-top-清空栈-处理栈

今天学习了利用数组方式的栈的C++实现,这种方式跟指针实现有很多不一样的地方: 栈的指针实现,栈的创建申请头结点,push需要申请新的结点,pop释放结点,这些结点都放在第一个位置,top时,S->next->data即可. 栈的数组实现,只申请一个结点,该结点的结构体内包含,数组的最大容量.栈顶元素下标.指向整形数组的指针(用于存放和删除新的元素). S->topOfStack == -1,空栈: S->topOfStack == S->capacity - 1,满栈: 1

Response.Write(&quot;&lt;script&gt;alert(&#39;弹出对话框!&#39;)&lt;/script&gt;&quot;) 后跟Response.Redirect(&quot;page.aspx&quot;);不能弹出对话框,直接跳转页面了 如何解?

Response.Write和Response.Redirect一起用的时候就会这样,write脚本和redirect脚本不能同时使用,这样不会执行脚本,最好使用ClientScript 改进方法: Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script language=javascript >alert('弹出对话框!');</script>");

一、实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

请指教交流! 1 package com.it.hxs.c01; 2 3 import java.util.Stack; 4 5 /* 6 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 7 */ 8 public class GetMinStack { 9 10 public static void main(String args[]) { 11 GetMinStack demoStack = new GetMinStack(); 12 demoStack.pus

请给出如下格式的date命令 例:11-02-26.再给出实现按周输出 比如:周六输出为6,请分别给出命令。

请给出如下格式的date命令 例:19-01-18.再给出实现按周输出 比如:周六输出为6,请分别给出命令. 解答: 方法1: [[email protected] ~]# date2019年 01月 17日 星期四 07:41:14 CST[[email protected] ~]# LANG=en[[email protected] ~]# date   Thu Jan 17 07:41:24 CST 2019 修改时间:[[email protected] ~]# date -s "201

天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数N:第二行给出N个互不相同的正整数,其间以空格分隔. 输出格式: 将输入的N个正整数顺序插入一个初始为空的二叉搜索树.在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格.第二行输出YES,如果该树是完全二叉树:否则输出NO. 输入样例1: 9 38 45 42 24 5

实现一个栈,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)

具体实现如下: #include<iostream> #include<stack> #include<string> #include<assert.h> using namespace std; template<class T> class Stack { public: void Push(const T& x); void Pop(); T& Min(); void PrintS(); private: stack<