建立栈的Java接口IStack,并用顺序栈类SqStack实现这个接口。要求
(1)编写所有栈的基本方法,包括(初始化、盘空、求长度、入栈、弹栈、取栈顶元素)
(2)调用初始化方法建立一个栈MyStack。
(3)调用入栈方法,依次使a,b,c,d,e入栈;
(4)输出顺序栈MyStack的长度;
(5)输出顺序栈MyStack中的所有元素;
(6)判断栈MyStack是否为空。
(7)释放顺序栈MyStack。
接口
package 栈;
interface IStack {
public void clear();
public boolean isEmpty();
public int length(); // 返回数据元素个数
public Object peek(); // 取栈顶元素并返回其值
public void push(Object x) throws Exception; // 将数据元素压入栈顶
public Object pop(); // 删除并返回栈顶元素
}
顺序栈与测试
package 栈;
class Node {
public Object data;// 存放节点值
public Node next;// 后继节点的引用
// 无参数时的构造函数
public Node() {
this(null, null);
}
// 带一个参数时的构造函数
public Node(Object data) {
this(data, null);
}
// 带两个参数的构造函数
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
//顺序栈
class SqStack implements IStack {
private Object[] stackElem;// 对象数组
private int top;// 在非空栈中,top始终指向栈顶元素的下一个存储位置,当栈为空时,top值为0
// 构造函数
public SqStack(int maxSize) {
top = 0;
stackElem = new Object[maxSize];// 为栈分配maxSize个存储单元
}
// 栈置空
@Override
public void clear() {
top = 0;
}
// 判断栈是否为空
@Override
public boolean isEmpty() {
return top == 0;
}
// 求栈中数据元素个数
@Override
public int length() {
return top;
}
// 取栈顶元素
@Override
public Object peek() {
if (!isEmpty()) {
return stackElem[top - 1];
} else {
return null;
}
}
// 入栈
@Override
public void push(Object x) throws Exception {
if (top == stackElem.length)// 栈满
throw new Exception("栈已满");
else
stackElem[top++] = x;// 先将X赋值给stackElem[top],再将top加一
}
// 出栈
@Override
public Object pop() {
if (isEmpty())
return null;
else
return stackElem[--top];// 先将top减一,再返回stackElem[top]的值
}
// 输出栈中所有元素(从栈顶到栈底元素)
public void display() {
for (int i = top - 1; i >= 0; i--) {
System.out.print(stackElem[i].toString() + " ");// 输出
}
}
}
public class MyStack{
public static void main(String[] args) throws Exception {
SqStack MyStack = new SqStack(20);
MyStack.push('a');
MyStack.push('b');
MyStack.push('c');
MyStack.push('d');
MyStack.push('e');
System.out.println("长度: "+MyStack.length());
while(! MyStack.isEmpty())
System.out.println(MyStack.pop());
System.out.println("MyStack是否为空? \n"+(MyStack.isEmpty()?"是":"不是"));
System.out.println("清空栈中...");
MyStack.clear();
System.out.println("栈清空了!");
}
}
运行截图
链表结构的顺序栈完整代码如下 :
public class Answer7723579 {
public static void main(String[] args) {
SqStack<String> myStack = SqStack.<String>init();
myStack.push("a");
myStack.push("b");
myStack.push("c");
myStack.push("d");
myStack.push("e");
System.out.println("顺序栈MyStack的长度: " + myStack.size());
System.out.print("顺序栈MyStack中的所有元素: ");
while (!myStack.isEmpty()) {
System.out.print(myStack.pop() + " ");
}
System.out.println();
System.out.println("栈MyStack是否为空: " + myStack.isEmpty());
myStack = null;
System.out.println("顺序栈MyStack已释放");
}
}
interface IStack<T> {
boolean isEmpty();
int size();
void push(T data);
T pop();
T peek();
}
class SqStack<T> implements IStack<T> {
DataNode<T> top;
int count;
public static <T> SqStack<T> init() {
SqStack<T> myStack = new SqStack<>();
return myStack;
}
public boolean isEmpty() {
return count==0;
}
public int size() {
return this.count;
}
public void push(T data) {
DataNode<T> newTop = new DataNode<>(data, top);
top = newTop;
++count;
}
public T pop() {
T data = this.top.data;
DataNode<T> newTop = this.top.next;
this.top = newTop;
--count;
return data;
}
public T peek() {
if(isEmpty()) {
return null;
}
return this.top.data;
}
class DataNode<T> {
T data;
DataNode<T> next;
public DataNode(T data, DataNode<T> next) {
this.data = data;
this.next = next;
}
}
}
运行结果如下:
顺序栈MyStack的长度: 5
顺序栈MyStack中的所有元素: e d c b a
栈MyStack是否为空: true
顺序栈MyStack已释放
如有帮助,请采纳,十分感谢!