stack的实现

来源:互联网 发布:三星s5230c软件 编辑:程序博客网 时间:2024/05/22 06:17

1,使用数组 实现 


public class ArrayStack implements Stack {String[] data; // 数据int N; // 位置public static void main(String[] args) {ArrayStack s = new ArrayStack(10);s.push("String1");s.push("String2");s.push("String3");System.out.println(s.size());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.isEmpty());}public ArrayStack(int size) {data = new String[size];N = 0;}@Overridepublic void push(String item) {if (data.length > N) {data[N] = item;N++;} else {throw new RuntimeException("stack 已满");}}@Overridepublic String pop() {N--;if (N < 0) {throw new RuntimeException("没有数据可以获取");}String str = data[N];data[N] = null;return str;}@Overridepublic boolean isEmpty() {return N == 0;}@Overridepublic int size() {return N;}}



2.使用链表 实现


public class LinkStack implements Stack {Node current = null;// 当前int size = 0;public static void main(String[] args) {LinkStack s = new LinkStack();s.push("String1");s.push("String2");s.push("String3");System.out.println(s.size());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.isEmpty());}@Overridepublic void push(String item) {Node node = new Node(item);if (current == null) {current = node;} else {node.next = current;current = node;}size++;}@Overridepublic String pop() {if (current == null) {throw new RuntimeException("没有数据可以获取");}String str = current.data;current = current.next;size--;return str;}@Overridepublic boolean isEmpty() {return size == 0;}@Overridepublic int size() {return size;}}class Node {public String data;public Node next;public Node(String item) {this.data = item;next = null;}}



3.动态大小的数组实现


public class ReSizeArrayStack implements Stack {String[] data; // 数据int N; // 位置public static void main(String[] args) {ReSizeArrayStack s = new ReSizeArrayStack(10);s.push("String1");s.push("String2");s.push("String3");System.out.println(s.data.length);System.out.println(s.size());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.pop());System.out.println(s.isEmpty());System.out.println(s.data.length);}public ReSizeArrayStack(int size) {data = new String[size];N = 0;}@Overridepublic String pop() {N--;if (N < 0) {throw new RuntimeException("没有数据可以获取");}String str = data[N];data[N] = null;if (N < data.length / 4) {resize(data.length / 2);}return str;}@Overridepublic void push(String item) {if (N >= data.length) {resize(data.length * 2);}data[N] = item;N++;}private void resize(int size) {String[] datas = new String[size];// 复制数据到新的数组中int min = data.length > size ? size : data.length;for (int i = 0; i < min; i++) {datas[i] = data[i];}data = datas;}@Overridepublic boolean isEmpty() {return N == 0;}@Overridepublic int size() {return N;}}



4.解析运算的字符串(+-)


public class 计算表达式解析 {public static void main(String[] args) {System.out.println(Analysis());}static String str = "(1-(2+3)+2)";private static String Analysis() {// System.out.println(str);LinkStack NStack = new LinkStack();LinkStack OStack = new LinkStack();for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if (c == '+' || c == '-') {OStack.push(c + "");} else if (c == '(') {str = str.substring(i + 1, str.length());NStack.push(Analysis());i = -1;} else if (c == ')') {str = str.substring(i + 1, str.length());NStack.push(jisuan(NStack, OStack));break;} else {NStack.push(c + "");}}return jisuan(NStack, OStack);}private static String jisuan(LinkStack NStack, LinkStack OStack) {String str2 = "";if (OStack.size == 0) {str2 = NStack.pop();}while (OStack.size > 0) {String op = OStack.pop();int a = Integer.parseInt(NStack.pop());int b = Integer.parseInt(NStack.pop());System.out.println("计算:" + b + op + a);if ("+".equals(op)) {str2 = (b + a) + "";} else if ("-".equals(op)) {str2 = (b - a) + "";}NStack.push(str2);}return str2;}}


0 0
原创粉丝点击