创建一个栈

package 栈;

//定义一个结点
class Node{
    Node next = null;
    Integer data;
    public Node(Integer data){
        this.data = data;
    }
}

public class Stack {
    Node top = null;
    
    //判断非空
    public boolean isEmpty(){
        return top == null;
    }
    
    //添加元素
    public void push(Integer data){
        Node node = new Node(data);
        node.next = top;
        top = node;
    }
    
    //弹出元素
    public Integer pop(){
        if(top == null){
            return null;//表示没有元素
        }
        Integer data = top.data;
        top = top.next;
        return data;
    }
    
    //取峰值
    public Integer peek(){
        if(isEmpty()){
            return null;//表示没有元素
        }
        
        return top.data;
    }
    
    //计算栈中的元素个数
    public Integer size(){
        Integer size =0;
        Node tmp = top;
        while(tmp!=null){
            size++;
            tmp = tmp.next;
        }
        return size;
    }
    
    //打印栈
    public void printStack(){
        Node tmp = top;
        while(tmp!=null){
            System.out.println(tmp.data);
            tmp = tmp.next;
        }
    }
    
    //主函数
    public static void main(String[] args) {
        Stack stack = new Stack();
        //向栈中添加元素
        stack.push(6);
        stack.push(5);
        stack.push(4);
        stack.push(3);
        stack.push(2);
        stack.push(1);
        
        System.out.println("栈中的元素个数为:"+stack.size());
        System.out.println("栈的峰值为:"+stack.peek());
        //打印栈
        stack.printStack();
        
        //弹出栈中的元素
        System.out.println("弹出"+stack.pop());
        System.out.println("弹出:"+stack.pop());
        System.out.println("弹出:"+stack.pop());
        System.out.println("弹出:"+stack.pop());
        System.out.println("弹出:"+stack.pop());
        System.out.println("弹出:"+stack.pop());
        
        System.out.println("栈中的元素个数为:"+stack.size());
        System.out.println("栈的峰值为:"+stack.peek());
        //打印栈
        stack.printStack();
    }
}

创建包含min()函数的栈

package 栈;

/**
 * 设计含最小函数min()的栈,要求min、push、pop的时间复杂度都是O(1)。
 * 
 * 思路:用数据栈和最小数据栈来模拟一个含有最小函数min()的栈,其中, 最小数据栈存储的
 * 是数据栈中的最小元素
 */
public class MinStack {
    Stack dataStack = new Stack();//定义存储数据的栈
    Stack minStack = new Stack();//定义存储最小数据的栈
    
    /**
     * 思路:首先向数据栈中添加数据,然后要判断最小数据栈是否为空,若为空,或者,最小
     * 数据栈中的峰值比新添加的元素大,也将新元素添加到最小数据栈中。
     */
    public void push(Integer data){
        dataStack.push(data);
        if(minStack.isEmpty() || minStack.peek()>data){
            minStack.push(data);
        }
    }
    
    /**
     * 思路:如果数据栈为空,直接返回null
     * 如果数据栈不为空,从数据栈中弹出栈顶元素,并返回。
     * 如果最小数据栈的栈顶元素与数据栈弹出的元素相同,那么最小数据栈也要弹出元素
     */
    public Integer pop(){
        if(dataStack.isEmpty()){
            return null;
        }
        Integer data = dataStack.pop();
        if(data == minStack.peek()){
            minStack.pop();
        }
        return data;
    }
    
    /**
     * 查看栈的峰值
     */
    public Integer peek(){
        return dataStack.peek();
    }
    
    /**
     * 查看栈中最小的元素
     */
    public Integer min(){
        return minStack.peek();
    }
    
    /**
     * 主函数
     */
    public static void main(String[] args) {
        MinStack minStack = new MinStack();
        minStack.push(4);
        minStack.push(1);
        minStack.push(6);
        minStack.push(8);
        System.out.println("栈中最小的元素为:"+minStack.min());
    }
}

两个栈实现一个队列

package 栈;

/**两个栈实现一个队列
 * 
 * 思路:
 * 栈1用于存储元素,栈2用于弹出元素。负负得正
 * 每次添加都往栈1中添加;
 * 每次弹出都从栈2弹出:
 *         如果栈2不为空,直接弹出栈2中的元素;
 *         如果栈2为空,这时要判断栈1是否为空
 *             若栈1为空,返回错误,
 *             若栈1不为空,则将栈1中的元素全部弹到栈2,然后从栈2中弹出元素。
 */
public class Queue {
    Stack stack1 = new Stack();
    Stack stack2 = new Stack();
    
    /**
     * 每次添加都往栈1里面添加
     */
    public void push(Integer data){
        stack1.push(data);
    }
    
    /**
     * 每次弹出都从栈2弹出;
     *    如果栈2不为空,直接弹出栈2中的元素;
     *    如果栈2为空,这时要判断栈1是否为空
     *       若栈1为空,返回错误,
     *       若栈1不为空,则将栈1中的元素全部弹到栈2,然后从栈2中弹出元素。
     */
    public Integer pop(){
        if(stack2.isEmpty()){
            if(stack1.isEmpty()){
                return null;
            }else{
                while(!stack1.isEmpty()){
                    stack2.push(stack1.pop());
                }
            }
        }
        return stack2.pop();
    }
    
    /**
     * 取队列的峰值
     */
    public Integer peek(){
        if(stack2.isEmpty()){
            if(stack1.isEmpty()){
                return null;
            }else{
                while(!stack1.isEmpty()){
                    stack2.push(stack1.pop());
                }
            }
        }
        return stack2.peek();
    }
    
    /**
     * 判断队列是否为空
     */
    public boolean isEmpty(){
        return stack1.isEmpty() && stack2.isEmpty();
    }
    
    /*
     * 主函数
     */
    public static void main(String[] args) {
        Queue queue = new Queue();
        queue.push(1);
        queue.push(2);
        queue.push(3);
        queue.push(4);
        while(!queue.isEmpty()){
            System.out.println(queue.pop());
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值