写在开始:这里这表明每种问题的思路,具体代码详见其他文章。
1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)。
1>借助两个栈S1,S2、S1存所有元素、S2存最小元素。
入栈----当遇到的元素小于S2栈顶的元素,则为最小元素,S1,S2都入栈,否则只入S1。
出栈-----遇到最小元素都出
S2栈顶保存当前栈的最小值
2>一个栈,放最小值和当前元素。(仅提供思路)
入栈---先将当前元素压栈然后将当前最小值压栈
出栈----一次出两个元素
栈顶元素即是最小值
3>一个栈,将当前元素和最小值封装成结构体
入栈----栈中无数据,当前元素直接入栈,当前元素的最小值大于栈顶元素的最小值时,更新当前元素的最小值域,并入栈。
出栈----直接出栈即可
栈顶元素的最小值域即为栈的最小值。
2.使用两个栈实现一个队列
入队列:只入栈S1出队列:如果栈S2为空,就把S1的元素全部搬移进S2(S2不为空,S2栈顶即为队头)。从S2出栈,即为出队列
队头:如果栈S2为空,就把S1的元素全部搬移进S2(S2不为空,S2栈顶即为队头)。返回S2栈顶元素
队尾:如果栈S1为空,就把S2的元素全部搬移进S1,(S1不为空,S1栈顶元素即为队尾)。 返回S1栈顶元素
3.使用两个队列实现一个栈
入栈:判断哪个队列不空将元素入哪个队列(第一个元素入q2)。
出栈:q1为空将q2的前size - 1个元素搬移进来,将q2最后一个元素出队列,同理将q1的最后一个元素出队列,即为出栈。
栈顶元素:判断哪个队列不为空,其队尾元素即为栈顶元素
4.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1)
设置两个指针、借助栈
一个指向入栈次序的开始、一个指向出栈序列的开始
栈为空,或栈顶元素不等于出队栈序列的索引所指向的元素,且入栈次序的索引未越过边界,此时入栈,入栈序列索引向后移动。
栈不为空,且栈顶和出栈次序的索引指向的元素相同,出栈,出队列索引向后移动。只要出队列索引未出边界循环前两步
5. 一个数组实现两个栈(共享栈)
1>两个栈相向增长
2>第一个栈的元素放在奇数位置、第二个栈的元素放在偶数位置(可能会造成空间浪费)