目录
栈的介绍
两种方法实现栈
1.数组栈
数组的构造:
入栈 *** 作
出栈:
打印数组栈
2.链栈
链栈的结点构造
链栈入栈 *** 作
链表的出栈 *** 作
链栈的打印
总结:
附录
栈的介绍
栈是一种只能在一端进行插入和删除 *** 作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始d出数据。”特点:先进后出。
如图
入栈:
第一个元素在栈底,最后以个入栈的在栈顶
出栈
出栈是移出栈顶元素
两种方法实现栈 1.数组栈数组栈,听名字就知道这是用数组简单实现的栈
数组的构造:注意:Maxsize指的是最大存储元素个数
Object[] list; int cur; public Stack(int Maxsize) { list = new Object[Maxsize]; cur = 0; }入栈 *** 作
定义了一个cur来做数组下标,当栈中没元素时,进行元素添加,cur++,即长度加1
public void push(Object x){ if (cur>list.length){ System.out.println("栈溢出"); return; } list[cur]=x; cur++; }出栈:
出栈 *** 作因为和入栈类似,当栈中有元素时进行一个cur--的 *** 作,即当前栈的长度减一从而达到
出栈的目的
public Object pop(){ if(isEmpty()){ System.out.println("栈为空"); return null; } Object x=list[cur-1]; cur--; return x; }打印数组栈
前面可以看出来,数组并没有达到先进后出的特点,但是,如果你将数组添加的一位当成开头,第一位当作结尾,那么这就是明显的先进后出的特点实际上,打印数组栈用的就是数组的逆序
public void display(){ if(isEmpty()){ System.out.println("栈为空"); return; } for (int i=cur-1;i>=0;i--){ System.out.print(list[i]+" "); } }2.链栈 链栈的结点构造
和链表的结点构造是一样的
public class Node { private Object data; public Node next;//指向下一个节点 //构造器 public Node(Object data){ this.data=data; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }链栈入栈 *** 作
链栈入栈 *** 作,实际上就是运用头插法进行链表连接 *** 作
public void push(Object x){ Node newNode=new Node(x); if(headNode.next==null){ headNode.next=newNode; }else { Node temp=headNode.next; headNode.next=newNode; newNode.next=temp; } }链表的出栈 *** 作
使用头插法,headNode.next中所储存的元素即为栈顶元素,所以直接将headNode.next指向栈顶的下一个元素,即headNode.next=headNode.next.next;
public Object pop(){ if(isEmpty()){ System.out.println("栈为空"); return null; } Node x=headNode.next; headNode.next=headNode.next.next; return x.getData(); }链栈的打印
和链表的打印是一样的
public void display(){ Node p=headNode; while (p.next != null) { System.out.print(p.next.getData() + " "); p = p.next; } }总结:
栈的特点是先进后出,这是重点,理清对栈的认识很重要
附录数组栈代码:
public class Stack { Object[] list; int cur; public Stack(int Maxsize) { list = new Object[Maxsize]; cur = 0; } public void clear(){ cur=0; } public boolean isEmpty(){ return cur==0; } public Object peek(){ return list[cur-1]; } public int length(){ return cur; } public void push(Object x){ if (cur>list.length){ System.out.println("栈溢出"); return; } list[cur]=x; cur++; } public Object pop(){ if(isEmpty()){ System.out.println("栈为空"); return null; } Object x=list[cur-1]; cur--; return x; } public void display(){ if(isEmpty()){ System.out.println("栈为空"); return; } for (int i=cur-1;i>=0;i--){ System.out.print(list[i]+" "); } } }
链栈代码:
public class linkStack { private Node headNode=new Node(null); public void clear(){ headNode.next=null; } public boolean isEmpty(){ return headNode.next.getData()==null; } public int length(){ int cur=0; if (isEmpty()){ System.out.println("栈为空"); return cur; } Node p=headNode; while (p.next != null) { p = p.next; cur++; } return cur; } public void push(Object x){ Node newNode=new Node(x); if(headNode.next==null){ headNode.next=newNode; }else { Node temp=headNode.next; headNode.next=newNode; newNode.next=temp; } } public Object peek(){ return headNode.next.getData(); } public Object pop(){ if(isEmpty()){ System.out.println("栈为空"); return null; } Node x=headNode.next; headNode.next=headNode.next.next; return x.getData(); } public void display(){ Node p=headNode; while (p.next != null) { System.out.print(p.next.getData() + " "); p = p.next; } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)