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