队列和栈

队列的基本操作

1.队列:先进先出,与栈操作不同,push操作为在队头加入元素,而pop操作是从队尾弹出一个元素。
栈和队列的基本操作都是时间复杂度为O(1)的操作

队列可以理解为一条直线,操作在两端执行,而栈理解为一条射线,只在一端操作。

案例一:编写一个类,只能用两个栈结构实现队列,支持队列的基本操作(push,pop)。(逻辑)

给定一个操作序列ope及它的长度n,其中元素为正数代表push操作,为0代表pop操作,保证操作序列合法且一定含pop操作,请返回pop的结果序列。
测试样例:
[1,2,3,0,4,0],6
返回:[1,2]

mycode

class TwoStack:
    def twoStack(self, ope, n):
        # write code here
        stack1 = []
        stack2 = []
        result = []
        for i in ope:
            if i == 0:
                if not stack2:
                    while stack1:
                        stack2.append(stack1.pop())
                result.append(stack2.pop())
            else:
                stack1.append(i)
        return result

注意事项:

  1. 如果将1栈的数据倒入二栈,必须一次性倒空
  2. 如果2栈有数的话不能向2栈中加入数

案例二:实现一个栈的逆序,但是只能用递归函数和这个栈本身的pop操作来实现,而不能自己申请另外的数据结构。(递归)

给定一个整数数组A即为给定的栈,同时给定它的大小n,请返回逆序后的栈。
测试样例:
[4,3,2,1],4
返回:[1,2,3,4]

思路

首先分析只能在本身的基础上实现,所以空间复杂度为O(1),可以通过两个递归函数来实现,辅助函数为取出栈底元素,并返回,栈底以上的元素不变。

    def pop_zhandi(self,A):
        result = A.pop()
        if not A:
            return result
        else:
            last = self.pop_zhandi(A)
            A.append(result)
        return last

其次通过主函数的递归函数,选择最后出栈的函数重新压入到栈中。倒序压入,最后便可以形成栈的逆序。

class StackReverse:
    def reverseStack(self, A, n):
        # write code here
        if not A:
            return 
        a = self.pop_zhandi(A)
        self.reverseStack(A,n-1)
        A.append(a)
        return A
    def pop_zhandi(self,A):
        result = A.pop()
        if not A:
            return result
        else:
            last = self.pop_zhandi(A)
            A.append(result)
        return last

案例三(双栈排序):一个栈中元素类型为整数,现在想将该栈从顶到底按大到小排序,只允许申请一个栈,除此外可以申请新的变量,但不能申请新的数据结构,如何完成排序。(栈的排序)