精华内容
下载资源
问答
  • 压入和弹出栈数据

    2021-10-19 22:57:54
  • 既然是压入和弹出,我们就按照压入和弹出的顺序将的操作进行一遍。 如果是正常的弹出顺序,那么经过这样一个完整的操作,最后的肯定是空栈;如果不是正常的弹出顺序,那么一定有元素不能按照这样的

    题目描述

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

    思路

    既然是栈的压入和弹出,我们就按照压入和弹出的顺序将栈的操作进行一遍。
    如果是正常的弹出顺序,那么经过这样一个完整的操作,最后的栈肯定是空栈;如果不是正常的弹出顺序,那么一定有元素不能按照这样的顺序弹出来。
    因此为了实行这样的思路,我们需要一个辅助栈来模拟这个操作。

    那么如何控制按顺序压入和弹出呢?
    1.给定两个指针 i 和 j ,分别指向两个数组的起始位置;
    2.当push[ i ] != pop[ j ]时,说明这个数并没有马上被弹出去,因此将其入栈,并且i++;
    3.当push[ i ]==pop[ j ]时,说明这个数刚被压入就弹出去了,这个数就不入栈了,直接 j++,再检查一下这时 j 的指向和栈顶元素是否相等,相等就弹出并且 j++;直到和栈顶不相等
    4.循环2,3步,直到把push序列遍历完
    5.按之前的分析,如果辅助栈空了,就说明所有元素正常弹出,否则就不是正常的弹出序列。

    实现

    class Solution {
    public:
        bool IsPopOrder(vector<int> pushV,vector<int> popV) {
            stack<int> s;
            
            int j=0;
            for (int i=0;i<pushV.size();i++)//遍历push序列
            {
                if (pushV[i]!=popV[j])//不相等就压入
                {
                    s.push(pushV[i]);
                }
                else
                {
                    j++;//相等就代表是立马弹出,就不用管了,j后移
                    while (!s.empty()&&popV[j]==s.top()) //判断要弹出的是否和栈顶相等
                    {
                        s.pop();//相等就弹出
                        j++;//j指针后移继续检查栈顶元素
                    }
                }
            }
            return s.empty();//最后空了就返回真
        }
    };
    
    展开全文
  • 文章目录前言压入弹出序列总结 前言 大二,刚刚开始学数据结构与算法,写得不好。。。。 压入弹出序列 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。 ...


    前言

    大二,刚刚开始学数据结构与算法,写得不好。。。。


    栈的压入、弹出序列

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
    例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:压入栈的所有数字均不相等,并且这两个序列的长度是相等的)。
    例如:
    输入:1 2 3 4 5
    4 3 5 1 2
    输出:NO
    输入:1 2 3 4 5
    4 5 3 2 1
    输出:YES

    //
    // Created by Kkoo on 2021/4/11.
    //
    
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct Stack {
        int data;
        int in[5];
        int out[5];
        struct Stack *next;
    } Stack;
    
    
    void InitStack(Stack *s, int n) {
        int i;
        Stack *p;
        for (i = 5; i >0; i--) {
            p = (Stack *) malloc(sizeof(Stack));
            p->data = i;
            p->next = s->next;
            s->next = p;
        }
    }
    
    void DisplayStack(Stack *s) {
        Stack *p = s;
        while (p->next != NULL) {
            p = p->next;
            printf("%d ", p->data);
        }
        printf("\n");
    }
    
    int check(Stack *s) {
        int i,j;
        int o = 0, top = 0;
        for (i = 1; i <= 5; i++) {
            for (j = o + 1; j <= s->out[i]; j++) {
                o = j;
                s->in[top++] = j;
                if (top > 5) {
                    return 0;
                }
            }
            if (s->in[--top] != s->out[i]) {
                return 0;
            }
        }
        return 1;
    }
    
    int main() {
        int i;
        Stack *s = (Stack *) malloc(sizeof(Stack));
        InitStack(s, 5);
        DisplayStack(s);
        for (i = 1; i <= 5; i++) {
            scanf("%d", &s->out[i]);
        }
        if (check(s) == 1)
            printf("YES\n");
        else
            printf("NO\n");
        DisplayStack(s);
        for (i = 1; i <= 5; i++) {
            scanf("%d", &s->out[i]);
        }
        if (check(s) == 1)
            printf("YES\n");
        else
            printf("NO\n");
        return 0;
    }
    

    总结

    就离谱 算法难的一批。
    展开全文
  • 压入弹出序列

    2021-09-08 21:47:22
    输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出...

    问题:
    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

    示例:
    输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
    输出:true
    解释:我们可以按以下顺序执行:
    push(1), push(2), push(3), push(4), pop() -> 4,
    push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

    思路:
    首先要定义一个辅助栈stack,目的是将压入栈的数组元素压入栈中。如何判断弹出栈数组是压入栈数组的真实弹出栈组合可以先将一个压入栈元素压入栈中。然后与弹出栈数组元素一一对比如果匹配成功在栈中就弹出该元素,然后弹出栈数组往后移动一位。如果匹配不成功压入栈数组元素再压入一个。循环往复直到压入栈数组没有元素压入为止或者弹出栈元素全部匹配成功为止。
    代码:

    public boolean validateStackSequences(int[] pushed, int[] popped) {
            Stack<Integer> stack1 = new Stack<Integer>();
            int j = 0;
            for(int i=0;i<pushed.length;i++){
                stack1.push(pushed[i]);
                while(j<popped.length&&!stack1.isEmpty()&&stack1.peek()==popped[j]){
                    j++;
                    stack1.pop();
                }
            }
            
            return j == popped.length;
        }
    
    展开全文
  • 压入弹出序列 题目 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈...
  • } //把添加的元素放新数组中的 newArr[elements.length]=element; //使用新数组替换就数组 elements=newArr; } //队 public int poll(){ //把数组中的第0个元素取出来 int element=elements[0]; //创建一个新的...
  • 左这道题目首先要明白这一数据结构,后进先。 先用一个来保存进栈的数据,再对比出栈的数据 import java.util.ArrayList; import java.util.Stack; public class Solution { public boolean IsPopOrder(int...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出...
  • 举例分析 上一篇:数据结构与算法–解决问题的方法-顺时针打印矩阵
  • 牛客 Leetcode 题目描述 输入两个整数序列,第一个序列表示的...如下图所示,给定一个 压入序列 pushed 弹出序列 popped ,则压入 / 弹出操作的顺序(即排列)是 唯一确定 的。 如下图所示,数据操作具有 先
  • 堆栈03--压入弹出序列-jz21题目概述解析&参考答案注意事项说明 题目概述 算法说明 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设入栈的所有数字均不...
  • 压入弹出序列 描述 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出...
  • 压入弹出系列

    2021-05-31 15:53:59
    题目描述 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。...每去压入一个的时候,都去判断是否与当前弹出一样,如果一样就弹出,如果不一样就继续压入。 首先
  • 目录题目:[剑指 Offer 31. 压入弹出序列](https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/)题目分析初始解答:学习他人:方法一:方法二:方法三:... 压入弹出序列 难度中等161 输
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...
  • 压入弹出序列题目:输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该...
  • 本系列旨在对比不同LeetCode的解题方法效率,占用空间等方面的区别,希望帮助大家能够精进代码水平,用更好的思维与方法去解题。其中的部分解题可能...输入两个整数序列,第一个序列表示压入顺序,请判断第二个.
  • /*** @auther 付强* @date 2020/2/13 - 12:45*/public class Mystack {//的底层我们使用数组来存储数据int[] elements;public Mystack(){elements=new int[0];}//压入元素public void push(int element){//创建一...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出...
  • package per.zhangyh.algorithm; /** *@author:zhangyonghui; *@date: 2021/3/21; 20:28 *@Describe: */ public class MyStackTest { public static void main(String[] args... //压入元素: myStack.push(2.
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,267
精华内容 20,106
热门标签
关键字:

压入和弹出栈数据

友情链接: VC2005Progress.rar