棧-鏈棧的基本操作及實現
鏈棧的儲存結構可用單鏈表來實現,假設指標指向單鏈表的首結點,由於在棧中入棧河出棧操作只能在棧頂進行,不存在在單鏈表任意位置進行插入和刪除操作的情況,所以在棧中不需要設定頭結點直接將棧頂元素放在單鏈表的首部成為首結點
鏈棧類的描述:
鏈棧中的結點類引用了連結串列中所討論的Node類。下面是實現Stack的java語言描述
package com.stackTest;
import com.test1.Node;
public class LinkStack implements Stack
{
private Node top;//棧頂元素的引用 //將棧置空 @Override public void clear() { top = null; } //判斷棧是否為空 @Override public boolean isEmpty() { return top == null; } @Override public int length() { // TODO Auto-generated method stub return 0; } //取出棧頂元素並且返回其值 @Override public Object peek() { if(!isEmpty()) { return top.getData(); } else { return null; } } @Override public void push(Object x) throws Exception { // TODO Auto-generated method stub } @Override public Object pop() { // TODO Auto-generated method stub return null; } //輸出棧中的所有元素(從棧頂到棧底) public void display() { Node p =top; //p指向棧頂元素 while(p != null) { System.out.println((p.getData()).toString() + "");//輸出所有非空結點的資料元素值 p = p.getNext(); //p指標向後移動 } }
}
————————————————————
下面介紹鏈棧的長度,入棧河出棧操作
1.求鏈棧的長度操作。求鏈棧長度操作的基本要求是計算出鏈棧中說包含資料元素的個數並且返回其值,此操作的基本思想與求單鏈表長度相同:引用一個指標p和一個技術變數length ,p的初始狀態指向棧頂元素,length的初始值為0;然後逐個進行計數,即p沿著鏈棧中的後繼指標逐個移動,同時length逐個加1,直至p指向空為止,此時length值幾位鏈棧的長度值。
演算法如下:
public int length()
{
Node p = top; //p指向棧頂元素
int length = 0; //計數器
while(p != null) //從棧頂元素開始向後查詢,直到p為空
{
p = p.getNext(); //p指向後繼結點
++length; //長度加1
}
return length;
}
鏈棧的入棧操作演算法:
public void push(Object x) throws Exception
{
Node p =new Node(x); //構造一個新結點
p.setNext(top);
top = p; //新結點成為當前的首結點
}
鏈棧的出棧操作演算法:
判斷鏈棧是否為空,若為空,則結束操作並返回null,否則,到下一步
確定被刪結點是棧頂結點
修改相關指標域的值,使棧頂結點從鏈棧中移去,並返回被刪結點資料域的值。
public void display()
{
Node p =top; //p指向棧頂元素
while(p != null)
{
System.out.println((p.getData()).toString() + “”);//輸出所有非空結點的資料元素值
p = p.getNext(); //p指標向後移動
}
}
——————————————
鏈棧操作的完整程式碼:
package com.stackTest;
import com.test1.Node;
public class LinkStack implements Stack
{
private Node top;//棧頂元素的引用
//將棧置空
@Override
public void clear()
{
top = null;
}
//判斷棧是否為空
@Override
public boolean isEmpty()
{
return top == null;
}
@Override
public int length()
{
Node p = top; //p指向棧頂元素
int length = 0; //計數器
while(p != null) //從棧頂元素開始向後查詢,直到p為空
{
p = p.getNext(); //p指向後繼結點
++length; //長度加1
}
return length;
}
//取出棧頂元素並且返回其值
@Override
public Object peek()
{
if(!isEmpty())
{
return top.getData();
}
else
{
return null;
}
}
@Override
public void push(Object x) throws Exception
{
Node p =new Node(x); //構造一個新結點
p.setNext(top);
top = p; //新結點成為當前的首結點
}
@Override
public Object pop()
{
if(isEmpty())
{
return null;
}
else
{
Node p = top; //p指向被刪除的結點
top=top.getNext(); //修改鏈指標,使棧頂結點從鏈棧中移去
return p.getData(); //返回資料域的值
}
}
//輸出棧中的所有元素(從棧頂到棧底)
public void display()
{
Node p =top; //p指向棧頂元素
while(p != null)
{
System.out.println((p.getData()).toString() + "");//輸出所有非空結點的資料元素值
p = p.getNext(); //p指標向後移動
}
}
}