1. 计算机中的栈 我们把生活中的栈的概念引入到计算机中,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中, 又可以从栈中出去。 栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出 的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一 个数据被第一个读出来)。 我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。
我们将用直接实践法得到经验
public interface IStack {
public void clear();
public boolean isEmpty();
public int length();
public Object peek() ;
public void push(Object x)throws Exception;
public Object pop();
public void display();
}
public class LinkStack implements IStack {
private Object[] stackElem; // 栈存储空间
private Node top;
//栈置空,
@Override
public void clear() {
top=null;
System.out.println("栈已经清空!");
System.out.print("\n");
}
@Override
public boolean isEmpty() {
if(top==null)
System.out.println("栈为空!");
else
System.out.println("栈已不为空!");
System.out.print("\n");
return top==null;
}
@Override
public int length() {
Node p=top;
int length=0;
while (p!=null){
p=p.next;
++length;
}
return length;
}
@Override
public Object peek() {
if (!isEmpty())//栈非空
return top.data;//取栈顶元素并返回其值
else
System.out.println("栈为空");
return null;
}
@Override
public void push(Object x) throws Exception {
//压栈
Node p=new Node(x);//构建新节点
p.next=top;//新节点的next指向top
top=p;//新结点p成为顶点
System.out.println("入栈成功!");
}
@Override
public Object pop() {//出栈
if (isEmpty()) {//栈空
return null;
} else {
Node p = top;//p指向被删除结点
top=top.next;//栈顶元素指向next,原来的p元素被删除
return p.data;//返回顶点的数据域的值
}
}
public int reverse1(int array[]) {
return 0;
}
@Override
public void display() {
System.out.println("栈的所有元素如下:");
Node p = top;// 取出带头结点的链栈表中的首结点元素
while (p!= null) {
System.out.print(p.data .toString()+ " ");// 输出数据元素的值
p= p.next;// 取下一个结点
}
System.out.println();
}
}
package LinKStack;
import java.util.Scanner;
public class Demo1 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
LinkStack L=new LinkStack();
boolean loop=true;
Scanner sc=new Scanner(System.in);
while(loop){
System.out.println("请选择下列数字进行相应的操作:");
System.out.println("1、求栈的长度");
System.out.println("2、判断栈是否为空");
System.out.println("3、清空栈");
System.out.println("4、取栈顶元素");
System.out.println("5、入栈的操作");
System.out.println("6、出栈操作");
System.out.println("7、显示所有元素");
System.out.println("8、退出");
int n=sc.nextInt();
switch(n){
case 1:{
System.out.println("栈的长度为:"+L.length());
break;
}
case 2:{
L.isEmpty();
break;
}
case 3:{
L.clear();
break;
}
case 4:{
L.peek();
break;
}
case 5:{
System.out.println("请输入入栈元素:");
int s=sc.nextInt();
L.push(s);
break;
}
case 6:{
L.pop();
break;
}
case 7:{
L.display();
break;
}
case 8:{
System.exit(0);
break;
}
default:
}
}
}
}
实验结果
文字有点绿大家见谅!
栈的逆置实现
public static void main(String[] args) throws Exception {
Object[] list={1,2,3,4,5};
LinkStack l=new LinkStack();
System.out.println("把 1 2 3 4 5 逆置后:");
for (int i = 0; i < list.length; i++) {
l.push(list[i]);
}
for (int i = 0; i < list.length; i++) {
list[i]=l.pop();
}
for (int i = 0; i < list.length; i++) {
System.out.printf(list[i]+"\t");
}
}