stack的实现

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;
	}

	@Override
	public void push(String item) {
		if (data.length > N) {
			data[N] = item;
			N++;
		} else {
			throw new RuntimeException("stack 已满");
		}
	}

	@Override
	public String pop() {
		N--;
		if (N < 0) {
			throw new RuntimeException("没有数据可以获取");
		}
		String str = data[N];
		data[N] = null;
		return str;
	}

	@Override
	public boolean isEmpty() {
		return N == 0;
	}

	@Override
	public 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());
	}

	@Override
	public void push(String item) {
		Node node = new Node(item);
		if (current == null) {
			current = node;
		} else {
			node.next = current;
			current = node;
		}
		size++;
	}

	@Override
	public String pop() {
		if (current == null) {
			throw new RuntimeException("没有数据可以获取");
		}
		String str = current.data;
		current = current.next;
		size--;
		return str;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public boolean isEmpty() {
		return N == 0;
	}

	@Override
	public 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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值