进栈出栈的合法性检查

栈与进栈出栈



栈:是限定在栈表尾进行插入或删除的线性表,又称为后进先出(LIFO)的线性表,这个特点可以形象的表示为……(铁路调度站)

只要保证每次在栈顶操作,同一进栈顺序可以有不同的出栈顺序,以下是部分出栈顺序

34521   25431  14532 32145    43215



那么究竟怎样验证一个出栈序列与一个入栈序列匹配?

思路:将进栈和出栈序列分别存在数组里,然后再创建一个辅助栈,把输入序列中的元素依次压入栈中,并按照出栈序列依次弹出。

将进栈和出栈序列存在两个数组里,然后再创建一个辅助栈,把输入序列中的元素依次压入栈中,并按照出栈序列依次弹出。

方法:以弹出序列4,5,3,2,1为例,第一个希望被弹出的数字是4,因此需要将4先压入栈中,而压入栈中的序列由进栈序列决定,也就是在4进栈之前保证1,2,3都在栈里面。这个时候栈中包含4个数字,分别是1,2,3,4,其中4位于栈顶,正好对应出栈数组的第一个,弹出栈顶元素4,接下来希望弹出的元素是5,而5不在栈中,因此需要将进栈序列4之后的元素压进去,这个时候5位于栈顶,就可以弹出来了,接下来希望被弹出的是3,2,1,在每次操作之前他们都位于栈顶,故直接弹出即可。

代码:

#include<iostream>
#include<stack>
using namespace std;
bool Check_Push_Pop(int* pPush,int* pPop,int length)
{
    if(length<=0 ||  pPush == NULL || pPop == NULL)
    {
        return false;
    }
    int in = 0;
    int out = 0;
    stack<int> s;
    //s.push(pPush[0]);
    int index = 0;  //压入元素的个数
    for(out = 0;out < length; out++)               //(1)for循环控制什么
    {
        for(in = index;in <=length; in++)  //pPush[1,2,3,4,5]   pPop[4,5,3,2,1]                                         
        {
             if((s.empty())||s.top()!=pPop[out])  //(2)为什么要进行判空
             {
                 if(in == length)                 //(3)if检测的是什么
                 {                       
                    return false;
                 }
                 s.push(pPush[in]);
                 ++index;
             }
             else
             {
                s.pop();
                break;                        //跳出这层for循环,使它遍历下一个出栈元素
             }
        }
    }
    if(s.empty() && in == length && out==length)
        return true;
    else
        return false;
}
void Test1()
{
    int Push[5] = {1,2,3,4,5};
    int Pop[5] = {4,5,3,2,1};
    if(Check_Push_Pop(Push,Pop,5))
    {
        cout<<"输入与输出匹配"<<endl;
    }
    else
    {
        cout<<"输入与输出不匹配"<<endl;
    }
}
void Test2()
{
    int Push[5] = {1,2,3,4,5};
    int Pop[5] = {4,5,3,1,2};
    if(Check_Push_Pop(Push,Pop,5))
    {
        cout<<"输入与输出匹配"<<endl;
    }
    else
    {
        cout<<"输入与输出不匹配"<<endl;
    }
}
int main()
{
    Test1();
    //Test2();
    system("pause");
    return 0;
}

总结:

如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把进栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈为止。如果所有的数字都压入了栈仍找到下一个弹出的数字,那么该序列不可能是一个弹出的序列。

对于入栈序列:1 2…i…j…k…n,那么它的出栈序列中不能有k…j…i这样的序列子集。即如果入栈序列为ABC,则出栈序列不可以是CAB。

例题:

某个栈的入队序列为A,B,C,D,E,则可能的出栈序列为()

A . ADBEC(DBC)         B. EBCAD  (EBC)

C. BCDEA                   D.  EABCD(EAB)

用上述规律可以得出选C

时间: 2024-10-17 14:09:11

进栈出栈的合法性检查的相关文章

判断栈的出栈顺序合法性

栈的出栈顺序合法性是指给定一系列元素,如1 - N,按照从小到大的方式入栈,每个元素的出栈时机不定.题目给定一个出栈顺序,我们来判断这个出栈顺序有没有可能发生. 比如对[1,2,3,4,5,6,7,8,9]: [1,2,3,4,5,6,7,8,9]是一个合法出栈序列 [9,8,7,6,5,4,3,2,1]也是一个合法序列 [4,5,3,2,7,6,1,8,9]也是一个合法序列 [3,4,5,1,2,9,8,7,6]就是一个非法序列 判断方法有两种,一种是对每一个值,其后所有小于它的值的数是一个降

数据结构之进栈出栈操作

先建立一个结构体节点: typedef struct Node{ int member; struct Node *pNext; }Node,*pNode: 创建一个栈: typedef struct stack{ pNode Top; pNode Bot; }Stack,*pStack; //初始话栈内部 void Init_stack(pStack ps) { ps->Top= (pNode)malloc(sizeof(Node)): if (NULL == ps->Top) exit(-

数据结构-顺序栈(进栈 出栈)

#include<stdio.h> #define MaxSize 10 typedef struct SqStack{ int data[MaxSize]; int top ; }SqStack; //初始化顺序栈 void initStack(SqStack &S){ S.top = -1; } //判断栈是否为空 /*栈理论上不存在为满的情况,取决于内存大小*/ int isEmpty(SqStack S){ if(S.top == -1){//top为1表示为空 return

栈之出栈序列合法性

#include<stdio.h> #include<string.h> #define MaxSize 100 typedef int DataType; typedef struct { DataType stack[MaxSize]; int top; }SeqStack; void StackInitiate(SeqStack *s)//初始化 { s->top=0; } int StackNotEmpty(SeqStack s)//非空否 { if(s.top<

检测出栈的合法性问题

题目:给定一个入栈和一个出栈序列?请判断是否合法 eg:入栈12345,出栈35124 用一个辅助栈,如果栈为空,就push(入栈序列) 比较栈顶元素和出栈序列当前值是否相等,若相等,出栈此元素,并将下次访问出栈序列位置后移:否则,继续入入栈序列里的元素. 重复1,2步骤,直到入栈序列为空,且栈顶元素不等于出栈序列当前访问位置时即不合法.栈空,入栈序列空,出栈序列空为合法出栈. 此例中将3,5,取出后,明显1不是栈顶元素,所以不是合法的. #include<iostream> #include

安卓 碎片 如何实现类似 活动 栈的 进栈 出栈

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 碎片 的 事物管理器 内部维持了 一个双向链表结构, 可以记录每次添加的碎片和 替代的 碎片. 然后 后退的时候, 会自动 出栈. 碎片,可以容易实现 局部更新. 原来 是把多个布局 放到 活动里. 现在可以用 碎片替代. 只在需要的时候加载 碎片. 提高了性能. 碎片 可以适应不同的屏幕尺寸. 切换碎片 ,通过 添加, 隐藏,添加另一个碎片.再次切换时,隐藏当前碎片,显示另一个.

(源代码见大话数据结构)栈的顺序存储结构——进栈&amp;出栈

#include <stdio.h>#include <time.h>#include <stdlib.h>#define MAXSIZE 1000#define OK 1#define ERROR 0#define TRUE 1#define FALS 0typedef int SElemType;typedef int Status;typedef struct{    SElemType data[MAXSIZE];    int top;}SqStack;Sta

进栈 出栈

#include "stdafx.h"#include "iostream" using namespace std; class Stack{public: virtual void push(char c) = 0; virtual char pop() = 0;}; class ArrayStack:public Stack{public: ArrayStack(int s); ~ArrayStack(); void push(char c); char po

C++:检查出栈顺序的合法性

CheckSequence.cpp #include<iostream> #include <assert.h> using namespace std; #include <stack> bool Checksequence(int *stackIn, int *stackOut,int lenIn,int lenOut){  assert(stackIn && stackOut);  if (lenIn != lenOut)         //两个