1. 程式人生 > >棧的基礎

棧的基礎

print ceo 方法 temp com public 需要 length obj

1.棧的基礎概念

a.棧是限制在表的一端進行插入(進棧)和刪除(出棧)運算的線性表,而進行這兩個操作,需要一個頭指針。
b.通常稱插入,刪除的這一端為棧頂,另一端為棧底。
c.當表中沒有元素時稱為空棧。假設棧S=(a1,a2,...an),a1稱為棧底元素,an稱為棧頂元素。

註意:棧是按後進先出的原則進行的,所以,棧稱為後進先出(先進後出)表。

2.棧的實現——順序棧

棧抽象數據結構 棧接口, 描述棧抽象數據類型,泛型參數T表示數據元素的數據類型:

package com.clarck.datastructure.stack;

/**
* 棧抽象數據結構 棧接口, 描述棧抽象數據類型,泛型參數T表示數據元素的數據類型
*
* @author clarck
*
* @param <T>
*/
public interface SStack<T> {
/**
* 判斷棧是否為空
*
* @return
*/
boolean isEmpty();

/**
* 元素x入棧
*
* @param x
*/
void push(T x);

/**
* 出棧,返回棧頂元素
*
* @return
*/
T pop();

/**
* 取棧頂元素, 未出棧
*
* @return
*/
T get();
}


順序棧:

package com.clarck.datastructure.stack;

/**
* 順序棧
*
* @author clarck
*
* @param <T>
*/
public class SeqStack<T> implements SStack<T> {
/**
* 存儲棧數據元素的數組
*/
private Object element[];

/**
* 棧頂元素下標
*/
private int top;

/**
* 構造容量為size的空棧
*/
public SeqStack(int size) {
this.element = new Object[Math.abs(size)];
this.top = -1;
}

/**
* 構造默認容量的空棧
*/
public SeqStack() {
this(64);
}

/**
* 判斷棧是否空,若空返回true
*/
@Override
public boolean isEmpty() {
return this.top == -1;
}

/**
* 元素x入棧,空對象不能入棧
*/
@Override
public void push(T x) {
if (x == null)
return;

// 若棧滿,則擴充棧容量
if (this.top == element.length - 1) {
Object[] temp = this.element;
// 重新申請一個容量更大的數組
this.element = new Object[temp.length * 2];
// 復制數組元素,O(n)
for (int i = 0; i < temp.length; i++) {
this.element[i] = temp[i];
}
}
this.top++;
this.element[this.top] = x;
}

/**
* 出棧,返回棧頂元素,若棧空返回null
*/
@SuppressWarnings("unchecked")
@Override
public T pop() {
return this.top == -1 ? null : (T) this.element[this.top--];
}

/**
* 取棧頂元素,未出棧,若棧空返回null
*/
@SuppressWarnings("unchecked")
@Override
public T get() {
return this.top == -1 ? null : (T) this.element[this.top];
}

/**
* 返回棧所有元素的描述字符串,形式為“(,)”,算法同順序表
*/
@Override
public String toString() {
String str = "(";
if (this.top != -1)
str += this.element[this.top].toString();
for (int i = this.top - 1; i >= 0; i--) {
str += ", " + this.element[i].toString();
}
return str + ") ";
}

}


順序棧的測試類:

package com.clarck.datastructure.stack;

/**
* 棧的測試類
*
* @author clarck
*
*/
public class Stack_test {
public static void main(String args[]) {
SeqStack<String> stack = new SeqStack<String>(20);
System.out.print("Push: ");
char ch = ‘a‘;
for (int i = 0; i < 5; i++) {
String str = (char) (ch + i) + "";
stack.push(str);
System.out.print(str + " ");
}
System.out.println(stack.toString());
}

}

測試結果如下:

Push: a b c d e (e, d, c, b, a) 

提醒:源碼下載鏈接為:

http://www.cnblogs.com/tanlon/p/4039667.html

3.棧的實現——鏈式棧

棧抽象數據結構 棧接口, 描述棧抽象數據類型,泛型參數T表示數據元素的數據類型:

package com.clarck.datastructure.stack;

/**
* 棧抽象數據結構 棧接口, 描述棧抽象數據類型,泛型參數T表示數據元素的數據類型
*
* @author clarck
*
* @param <T>
*/
public interface SStack<T> {
/**
* 判斷棧是否為空
*
* @return
*/
boolean isEmpty();

/**
* 元素x入棧
*
* @param x
*/
void push(T x);

/**
* 出棧,返回棧頂元素
*
* @return
*/
T pop();

/**
* 取棧頂元素, 未出棧
*
* @return
*/
T get();
}


棧結點類,T指定結點的元素類型:

package com.clarck.datastructure.stack;

/**
* 單鏈表結點類,T指定結點的元素類型
*
* @author clarck
*
* @param <T>
*/
public class Node<T> {
/**
* 數據域,保存數據元素
*/
public T data;

/**
* 地址域,引用後繼結點
*/
public Node<T> next;

/**
* 構造結點,data指定數據元素,next指定後繼結點
*
* @param data
* @param next
*/
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}

/**
* 構造節點
*/
public Node() {
this(null, null);
}

/**
* 返回結點元素值對應的字符串
*/
@Override
public String toString() {
return this.data.toString();
}

/**
* 比較兩個結點值是否相等,覆蓋Object類的equals(obj)方法
*/
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
return obj == this || obj instanceof Node && this.data.equals(((Node<T>)obj).data);
}

}

 

鏈式棧:

package com.clarck.datastructure.stack;

/**
* 鏈式棧
*
* @author clarck
*
* @param <T>
*/
public class LinkedStack<T> implements SStack<T> {
/**
* 棧頂結點
*/
private Node<T> top;

/**
* 構造空棧
*/
public LinkedStack() {
this.top = null;
}

/**
* 判斷棧是否空,若空返回true
*/
@Override
public boolean isEmpty() {
return this.top == null;
}

/**
* 元素x入棧,空對象不能入棧
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void push(T x) {
//頭插入,x結點作為新的棧頂結點
if (x != null) {
this.top = new Node(x, this.top);
}
}

/**
* 出棧,返回棧頂元素,若棧空返回null
*/
@Override
public T pop() {
if (this.top == null)
return null;
//取棧頂結點元素
T temp = this.top.data;
//刪除棧頂結點
this.top = this.top.next;
return temp;
}

/**
* 取棧頂元素,未出棧,若棧空返回null
*/
@Override
public T get() {
return this.top == null ? null : this.top.data;
}

/**
* 返回棧所有元素的描述字符串,形式為“(,)”。算法同不帶頭結點的單鏈表
*/
@Override
public String toString() {
String str = "(";
for (Node<T> p = this.top; p != null; p = p.next) {
str += p.data.toString();
//不是最後一個結點時後加分隔符
if (p.next != null) {
str += ", ";
}
}
return str + ") ";
}

}


棧的測試類:

package com.clarck.datastructure.stack;

/**
* 棧的測試類
*
* @author clarck
*
*/
public class Stack_test {
public static void main(String args[]) {
LinkedStack<Integer> stack2 = new LinkedStack<Integer>();
System.out.print("Push: ");
for (int i = 1; i <= 5; i++) {
Integer intobj = new Integer(i);
stack2.push(intobj);
System.out.print(intobj + " ");
}

System.out.println("\n Stack: " + stack2.toString());
System.out.print("Pop: ");
while (!stack2.isEmpty()) { // 全部出棧
System.out.print(stack2.pop().toString() + " ");
}
System.out.println();
}

}


測試結果:

Push: 1 2 3 4 5
Stack: (5, 4, 3, 2, 1)
Pop: 5 4 3 2 1

提醒:源碼下載地址為:

http://www.cnblogs.com/tanlon/p/4039677.html

棧的基礎