创建一个栈 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()); } } }