栈的题目

栈的特点,就是先进后出。栈可以是链表形式,也可以用数组形式实现。

package 程序员面试金典;

/**
 * 第三章
 */
public class Unit3 {

    public static void main(String[] args) {

    }

}

// 第一题 一个数组三个栈,返回最小值O(1)
class stackMyself {
    private int[] data = new int[30];
    private int stack1 = 0;
    private int stack2 = 10;
    private int stack3 = 20;
    private int minStack1 = 0;

    public stackMyself() {

    }

    // 栈1--
    public int getMin() {
        return minStack1;
    }

    public void pushStack1(int d) {
        if (stack1 < 10) {
            if (stack1 == 0)
                minStack1 = d;
            else {
                if (d < minStack1)
                    minStack1 = d;
            }
            data[stack1++] = d;
        } else {
            System.err.println("栈1满了");
        }
    }

    public int popStack1() {
        if (stack1 >= 0)
            return data[--stack1];
        else
            return -1;
    }

    public int getStack1Top() {
        int t = stack1 - 1;
        return data[t];
    }

    // 栈2
    public void pushStack2(int d) {
        if (stack2 < 20)
            data[stack2++] = d;
        else {
            System.err.println("栈2满了");
        }
    }

    public int popStack2() {
        if (stack2 >= 10)
            return data[--stack2];
        else
            return -1;
    }

    public int getStack2Top() {
        int t = stack2 - 1;
        return data[t];
    }

    // 栈3
    public void pushStack3(int d) {
        if (stack3 < 30)
            data[stack3++] = d;
        else {
            System.err.println("栈3满了");
        }
    }

    public int popStack3() {
        if (stack3 >= 20)
            return data[--stack3];
        else
            return -1;
    }

    public int getStack3Top() {
        int t = stack3 - 1;
        return data[t];
    }

}

// 链式栈
class SetOfStack {
    private stackNode first;
    private stackNode current;

    public SetOfStack() {
        first = new stackNode();
        first.setNext(null);
        current = first;
    }

    // 入栈
    public void insertValue(int d) {
        stackNode runner = first;
        while (runner.getNext() != null)
            runner = runner.getNext();
        if (runner.getTop() != runner.getSize() - 1)
            runner.push(d);
        else {
            stackNode newnode = new stackNode();
            runner.setNext(newnode);
            runner = newnode;
            runner.push(d);
            current = runner;
        }
    }

    // 出栈
    public int pop() {
        if (current.getTop() == -1) {
            stackNode runner = first;
            while (runner.getNext() != current)
                runner = runner.getNext();
            current = runner;
            current.setNext(null);
        }
        return current.pop();
    }

    // 打印
    public void printStack() {
        stackNode runner = first;
        while (runner != null) {
            runner.printStack();
            runner = runner.getNext();
        }
    }
}

class stackNode {
    private stackNode next;
    private int[] data;
    private int size = 10;
    private int top = -1;

    public stackNode() {
        data = new int[size];
    }

    public stackNode getNext() {
        return next;
    }

    public int getTop() {
        return top;
    }

    public int getSize() {
        return size;
    }

    public void setNext(stackNode next) {
        this.next = next;
    }

    // 入栈
    public void push(int d) {
        if (top != size - 1)
            data[++top] = d;
        else
            System.err.println("此栈已满");
    }

    // 出栈
    public int pop() {
        if (top != -1)
            return data[top--];
        else
            return -1;
    }

    // 打印栈
    public void printStack() {
        for (int i = 0; i <= top; i++)
            System.out.print(data[i] + " ");
        System.out.println();
    }
}

// 汉诺塔栈
class hanioStack {
    private stackNode Astack;
    private stackNode Bstack;
    private stackNode Cstack;

    public hanioStack() {
        Astack = new stackNode();
        Bstack = new stackNode();
        Cstack = new stackNode();
    }

    public void initA(int[] data) {
        for (int i = 0; i < data.length; i++)
            Astack.push(data[i]);
    }

    public void MoveTo(char A, char C) {
        if (A == ‘A‘ && C == ‘C‘) {
            int data = Astack.pop();
            Cstack.push(data);
        } else if (A == ‘A‘ && C == ‘B‘) {
            int data = Astack.pop();
            Bstack.push(data);
        } else if (A == ‘B‘ && C == ‘C‘) {
            int data = Bstack.pop();
            Cstack.push(data);
        } else if (A == ‘B‘ && C == ‘A‘) {
            int data = Bstack.pop();
            Astack.push(data);
        } else if (A == ‘C‘ && C == ‘A‘) {
            int data = Cstack.pop();
            Astack.push(data);
        } else if (A == ‘C‘ && C == ‘B‘) {
            int data = Cstack.pop();
            Bstack.push(data);
        }
        printStack();
    }

    public void HanioTower(int n, char A, char B, char C) {

        if (n == 1)
            MoveTo(A, C);
        else {
            HanioTower(n - 1, A, C, B);
            MoveTo(A, C);
            HanioTower(n - 1, B, A, C);
        }

    }

    public void printStack() {
        System.out.print("A:");
        Astack.printStack();
        System.out.print("B:");
        Bstack.printStack();
        System.out.print("C:");
        Cstack.printStack();
    }
}
class MyQueue{
    private stackNode stack1;
    private stackNode stack2;
    public void inQueue(int data){
        while(stack2.getTop() != -1)
        {
            int d = stack2.pop();
            stack1.push(d);
        }
        stack1.push(data);
    }
    public int outQueue(){
        while(stack1.getTop() != -1)
        {
            int d = stack1.pop();
            stack2.push(d);
        }
        return stack1.pop();
    }
}

思考题目的时候,已形成本能,不知道如何总结。反过来想的话,就是问题和数据结构的特性。比如第一题,一个数组三个栈,那么肯定是分割数组了。比如MyQueue这题,因为栈是先进后出,队列是先进先出。题目要求可以用两个栈,那么肯定是可以来回倒腾,把最先和最后元素呈现出来。栈的特性,和一些经典问题切合可以更深理解数据结构。比如表达式的变换(前缀,中缀,后缀),以及树遍历的非递归法,等等。比如代码中函数的调用,递归也是将顶层函数压栈,到底了之后不断弹出执行。

时间: 2024-11-05 15:37:04

栈的题目的相关文章

hdu1022(Train Problem I)----- 典型栈类题目

点击打开链接 Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here

【编程题目】栈的 push、pop 序列

29.栈的 push.pop 序列(栈)题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整数都是不相等的. 比如输入的 push 序列是 1.2.3.4.5,那么 4.5.3.2.1 就有可能是一个 pop 系列.因为可以有如下的 push 和 pop 序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的 pop

单调栈题目总结

把单调栈的题目总结在一起吧QAQ--记得加上这个分组的上一篇(第一篇 bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int M=50007; int read(){ int ans=0,f=1,c=getchar(); while(c&l

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(

POJ 3494 Largest Submatrix of All 1’s(单调栈)

题目: Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 5540   Accepted: 2085 Case Time Limit: 2000MS Description Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest w

UVA514 - Rails(栈)

题目:UVA514 - Rails(栈) 题目大意:某城市有一个火车站,铁轨成Y字形,有n节车厢从A方向驶入车站,按进站顺序编号1-n,现在给你一个序列代表进入B的顺序,你可以借助一个C中转站,问能否可以按这样的序列驶入B. 解题思路:栈模拟,中转站就代表栈,将车厢入栈后,只能从栈顶一个一个出去.注意输出每个cas都有一个空行. 代码: #include <cstdio> #include <cstring> #include <stack> using namespa

微软算法100题66 颠倒栈

66.颠倒栈.题目:用递归颠倒一个栈.例如输入栈{1, 2, 3, 4, 5},1 在栈顶.颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶. 思路: 首先想到的是再创建一个新栈,用来接收旧栈的数据,但这样空间复杂度是o(n),可不可以用原有的栈完成颠倒的操作呢? 假设栈里只有两个元素1,2,pop出1后,栈里剩下2,我们所做的是把2再弹出,将1push回栈,再push2, 比较重要的是往回push的过程,如果判断栈里还有剩余元素,则需要把剩余元素先都pop出栈,再push元素入栈,这

浅谈—单调栈

一.概念: 单调栈的本质还是一个栈,只不过是栈的元素从栈底到栈顶单调递增或者是单调递减. 二.单调栈的维护: 每加入一个元素,将这个元素和栈顶元素相比较,(假设你维护的是一个单调递增的栈),如果当前元素大于等于栈顶元素,说明这个元素 没有破坏这个栈的单调性,直接加入:如果当前元素小于栈顶元素,直接向栈中加入元素会破坏栈的单调性,这时我们需要将栈顶元素依次弹出,知道遇到第一个 大于或者等于当前元素的元素,再将该元素压入栈中.时间复杂度O(n),所有的元素都会进栈一次. 三.单调栈的性质: (1)单

单调栈练习题题解

单调栈 单调栈顾名思义就是让栈中的元素是单调的,要么递增,要么递减.同样它也满足栈的性质,先进后出. 单调递增栈,则从栈顶到栈底的元素是严格递增的 单调递减栈,则从栈顶到栈底的元素是严格递减的 练习题 单调栈 练习题 POJ3250 POJ2796 BZOJ1113 HDU1506 POJ2559 JDFZ2997 POJ3250 POJ3250传送门 对于每一个牛来说,能看到的数目为向右数身高比它小的个数,累加就是答案. 所以可以倒着维护一个单调递增的栈,记录i之前的弹栈数目,累加. (正着也