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


DFS(深度优先搜索)是一种图遍历算法,可以用来解决很多问题,比如查找图中的连通分量、查找图中的路径等。在Java中,我们可以用Stack实现DFS算法。 DFS使用栈(Stack)数据结构来存储待遍历的节点。具体实现步骤如下: 1. 首先,我们需要创建一个Stack对象来存储待遍历的节点。 2. 然后,我们选择一个起始节点作为DFS的起点,将其入栈。 3. 接着,我们进行循环操作,直到栈为空为止。每次循环中,我们从栈中取出一个节点,将其标记为已访问,并遍历其邻居节点。将邻居节点中未访问过的节点入栈。 4. 最后,当栈为空时,表示DFS遍历结束。 这样就可以使用Stack实现DFS算法。下面是一个简单的Java代码示例: ```java import java.util.Stack; public class DFSStack { public void dfs(int[][] graph, int start) { boolean[] visited = new boolean[graph.length]; Stack<Integer> stack = new Stack<>(); stack.push(start); while (!stack.isEmpty()) { int node = stack.pop(); if (!visited[node]) { visited[node] = true; System.out.print(node + " "); for (int i = 0; i < graph.length; i++) { if (graph[node][i] == 1 && !visited[i]) { stack.push(i); } } } } } public static void main(String[] args) { int[][] graph = { {0, 1, 1, 0, 0}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {0, 1, 1, 0, 1}, {0, 0, 1, 1, 0} }; DFSStack dfs = new DFSStack(); dfs.dfs(graph, 0); } } ``` 以上就是用Stack实现DFS算法的一个简单例子。通过这种方式,我们可以使用Stack数据结构来实现深度优先搜索算法,解决各种与图相关的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值