精华内容
下载资源
问答
  • 压入和弹出栈数据数据的入栈和出栈数据入栈指令数据出栈指令 数据的入栈和出栈 栈在处理函数调用过程中起到至关重要的作用。 栈是一种数据结构,可以添加或删除值,不过要遵循后进先出的原则。 通过push操作把数据压...

    数据的入栈和出栈

    栈在处理函数调用过程中起到至关重要的作用。
    栈是一种数据结构,可以添加或删除值,不过要遵循后进先出的原则。
    通过push操作把数据压入栈中,通过pop操作删除数据。
    它具有一个属性:弹出的值永远是最近被压入而且仍然在栈中的值。
    栈可以实现为一个数组,总是从数组的一端插入和删除元素。这一端被称为栈顶。
    在x86-64中,程序栈存放在内存中某个区域。
    栈向下增长,这样一来,栈顶元素的地址是所有栈元素地址中最低的。
    栈指针%rsp保存着栈顶元素的地址。

    数据入栈指令

    指令 效果 描述
    pushqSpushq \quad S R[%rsp]R[%rsp]8;M[R[%rsp]]SR[\%rsp]\leftarrow R[\%rsp]-8;\\M[R[\%rsp]] \leftarrow S 将四字压入栈中

    pushq指令的功能是把数据压入到栈上,将一个四字值压入栈中,首先要将栈指针减8,然后将值写道新的栈顶地址。

    数据出栈指令

    指令 效果 描述
    popqDpopq \quad D DM[R[%rsp]];R[%rsp]R[%rsp]+8D \leftarrow M[R[\%rsp]]; \\R[\%rsp] \leftarrow R[\%rsp] + 8 将四字弹出栈

    pop指令是弹出数据,弹出一个四字的操作包括从栈顶位置读出数据,然后栈顶指针加8.
    因为栈和程序代码以及其他形式的程序数据都是放在同一内存中,所以程序可以用标准的内存寻址方法访问栈内的任意位置。

    展开全文
  • 当时我在学习这个的时候也是非常不理解这个问题,一个压入和弹出序列的判断一看不就知道了么,还去判断干嘛。只要符合后进先出的规则就行。但是我在这里简单说一下这个压入和弹出序列是怎么回事。就是我们给定...

      当时我在学习这个的时候也是非常不理解这个问题,一个栈的压入和弹出序列的判断一看不就知道了么,还去判断干嘛。只要符合后进先出的规则就行。但是我在这里简单说一下这个压入和弹出序列是怎么回事。就是我们给定假设的两个序列,一个为压入序列,一个为弹出序列。然后我们再通过一个辅助的栈,把压入序列的数据一个一个push()进入临时的辅助栈中,如果栈顶元素刚好和弹出序列的数据一样,那么我们就弹出,如果不一样我们就将压入序列的数据继续压入临时栈中,直到到达序列结束。如果压入序列结束,临时栈全部数据弹出那么就是一个弹出压入或者弹出序列。直接上图理解一下:

                                     

      代码如下:

    public boolean isPopOrder(int arr1[],int arr2[]){
        //判断两个序列是否有空序列
        if(arr1.length == 0 || arr2.length == 0){
              return false;
        }
        //创建一个临时的辅助栈
        Stack<Integer> s = new Stack<>();
        //将数据压入栈中并进行比较
        for(int i = 0,j = 0;i < arr1.length;){
             s.push(arr1[i]);
             //判断栈顶元素是否和弹出序列一致
             while(s.size() > 0 && s.peek() == arr2[j]){
                  s.pop();
                  j++;
             }
        }
        return  s.isEmpty();
    }

       我上边的代码使用的数组来对序列进行实现。arr1表示压入序列,arr2表示弹出序列。关键我们需要抓住的是在压入时进行循环的弹出比较就行了,借助于一个临时栈对算法进行实现。

    转载于:https://www.cnblogs.com/zslli/p/8045938.html

    展开全文
  • 压入弹出序列 题目连接. 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设压入栈的所有数字均不相等。例如序列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就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

    解题思路
    借助一个辅助栈,遍历压栈顺序,先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出站序列的第一个元素。这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
    举例
    入栈1,2,3,4,5;出栈4,5,3,2,1
    首先1入辅助栈,此时栈顶1≠4,继续入栈2
    此时栈顶2≠4,继续入栈3
    此时栈顶3≠4,继续入栈4
    此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3
    此时栈顶3≠5,继续入栈5
    此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3
    ….
    依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。

    import java.util.ArrayList;
    import java.util.Stack;
    
    public class Solution {
        public boolean IsPopOrder(int [] pushA,int [] popA) {
        	Stack<Integer> stack = new Stack<>();
        	int index = 0;
        	for (int i = 0; i < pushA.length; i++){
    			stack.push(pushA[i]);
    			//此处必须判空是因为调用stackA.peek()时
    			//如果stackA为空将会返回EmptyStackException异常,源码上有
    			while(!stack.isEmpty() && stack.peek() == popA[index]){
    				stack.pop();
    				index++;
    			}
    		}
    		return stack.isEmpty();
        }
    }
    
    展开全文
  • 压入和弹出序列

    2020-11-10 12:43:24
    题目:输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设压入栈的所有数字均不相等。例如序列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就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

    思路:1,将数据进行顺序压入,每次压入后,判断peek元素与出栈数组指针判断,如果相等,则出栈,出栈数组指针后移,最终判断栈是否为空,即可确定最终结果

    import java.util.ArrayList;
    import java.util.Map;
    import java.util.HashMap;
    import java.util.Stack;
    
    public class Solution {
        public boolean IsPopOrder(int [] pushA,int [] popA) {
            boolean res;
    		if(pushA==null||popA==null) {
    			res = false;
    		}
    		int popstart = 0;
    		Stack<Integer> stack = new Stack<Integer>();
     		for(int i=0;i<pushA.length;i++) {
    			stack.push(pushA[i]);
    			while(!stack.isEmpty()&&stack.peek()==popA[popstart]) {
    				stack.pop();
    				popstart++;
    			}
    		}
     		res = stack.isEmpty();
     		return res;
        }
    }
    
    展开全文
  • // 压入弹出两个操作的时间复杂度均为:常量级 // PushStack(S,x)将元素压入栈 PushStack(S,x) { int m; //m为最大容量; if(top = m) Error(); //已满 else { top = top+1; S[top] = x; ...
  • 压入弹出序列

    万次阅读 2020-02-24 10:24:13
    压入弹出序列题目描述算法分析   作为一种基本的数据结构,在各种题目里已经是屡见不鲜了,本文来讲解一下的基本操作,压栈出栈,基本概念没什么讲的,所以就讲酱合法的序列关系。阅读本文假定已经...
  • 压入弹出序列

    2019-10-07 00:49:16
    1.首先需要有一个栈,列表 2.按照pushV的方式入栈 ...5.判断需要弹出的情况的条件,入栈的顶部和弹出栈的顶部数据相等 转载于:https://www.cnblogs.com/xiaoyaoguangzhai/p/11479847.html...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...
  • 输入两个整数序列,第一个序列表示压入顺序,请推断第二个序列是否为该弹出顺序。 如果压入栈的全部数字均不相等。比如序列1,2,3,4,5是某压入顺序,序列4。5,3,2,1是该压栈序列相应的一个弹出序列。但4...
  • 二叉树前序-中序-后序遍历(递归、结构) 以下代码均可直接运行: 其中单链表的两种方法,主要在于pop()push()的方式不太一样,其余都大同小异。同样也可以用双链表实现,单链表也没差差别,定义Node的时候...
  • 定义数据结构,请在该类型中实现一个能够得到的最小元素的 min 函数在该中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 分析 利用辅助实现数据保存 代码实现 class MinStack { Stack<Integer>...
  • 压入弹出

    2015-07-17 19:28:00
    这个题目,其实考的是的本质问题,也就是它的压入和弹出的顺序。首先我们分析题目中所给的那几个例子,也就是数据的压入顺序是1、2、3、4、5。但是弹出的顺序是4、5、3、2、1。这个好办啦,猜都能猜到它是如何操作...
  • 题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能...判断需要弹出的情况的条件,压入栈的顶部和弹出栈的顶部数据相等 解答 方法一 class Solution: def IsPopOrder(self, pushV, popV):
  • 题目描述:输入两个整数序列,第一个序列表示的压入顺序,请判断第二个...(注意:这两个序列的长度是相等的)解题思路:用一个来模拟压入和弹出序列,在中根据压栈序列压入数据,当栈顶数据和弹出序列中的...
  • 思路:定义两个指针sPushsPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次入栈中,直到入栈中的数据和第二个栈中sPop所指向的数据相等,就将这个数据弹出栈。sPop指向下一个数字。...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但...
  • 按照压栈序列,逐个压入元素,当辅助的栈顶元素与数据栈的栈顶元素相等时,两者同时弹出栈顶。 然后再比较辅助的栈顶是否数据栈的栈顶元素相同,若不相同,再向数据栈压入元素,直至压入的元素 辅助的栈顶...
  • 21.压入弹出序列 题目描述 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否可能为该弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某压入顺序,序列4,5,3,2,1是...
  • 输入两个整数序列,第一个序列表示压入顺序,请判断第二个序列是否为该弹出顺序。假设压入栈的所有数字均不相等。 例如,序列 {1,2,3,4,5} 是某的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出...
  • 牛客 Leetcode 题目描述 输入两个整数序列,第一个序列表示的...如下图所示,给定一个 压入序列 pushed 弹出序列 popped ,则压入 / 弹出操作的顺序(即排列)是 唯一确定 的。 如下图所示,数据操作具有 先入
  • 跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力解决问题的能力...Java版剑指offer编程题第21题–压入弹出序列: 输入两个整数序列,第一个序列表示压入顺...
  • 二刷,第一反应就是使用另外的数据结构来模拟。解决方法我想的是一样的,只不过我想的是LinkedList,其它人用的是Stack。 我的思路就是反方向的pushed,并且正方向的从popped中找。 另外的思路其实更简单,那就是...
  • 压栈:的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:的删除操作叫做出栈。出数据也在栈顶。 2、数据结构 的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。 定长的静态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 721
精华内容 288
关键字:

压入和弹出栈数据