[例子和習題出自資料結構(
嚴蔚敏版
棧的實現
棧是一種先進後出的資料結構, 首先定義了棧需要實現的介面:
public inte***ce mystack
棧的陣列實現, 底層使用陣列:
public class myarraystackimplements mystack
@override
public void clear()
size = 0;
} @override
public int length()
@override
public boolean push(t data)
objs[size++] = data;
return true;
} /**
* 陣列擴容
*/private void resize()
objs = temp;
} @suppresswarnings("unchecked")
@override
public t pop()
return (t) objs[--size];
} @override
public string tostring()
} return sb.tostring();
}}
棧的鍊錶實現, 底層使用鍊錶:
public class mylinkedstackimplements mystack
@override
public boolean isempty()
@override
public void clear()
@override
public int length()
@override
public boolean push(t data)
@override
public t pop()
return null; }
/*** 將資料封裝成結點
*/private final class node
}
兩種實現的比較, 主要比較資料入棧和出棧的速度:
@test
public void testspeed()
long temp = system.currenttimemillis();
system.out.println("push time: " + (temp - start));
while (stack.pop() != null)
; system.out.println("pop time: " + (system.currenttimemillis() - temp));
}
push time: 936
pop time: 47
push time: 936
pop time: 126
可見兩者的入棧速度差不多, 出棧速度myarraystack則有明顯的優勢.
為什麼測試結果是這樣的? 可能有些朋友的想法是陣列實現的棧應該具有更快的遍歷速度, 但增刪速度應該比不上鍊表實現的棧才對. 但是棧中資料的增刪具有特殊性: 只在棧頂入棧和出棧. 也就是說陣列實現的棧在增加和刪除元素時並不需要移動大量的元素, 只是在陣列擴容時需要進行複製. 而鍊錶實現的棧入棧和出棧時都需要將資料報裝成node或者從node中取出資料, 還需要維護棧頂指標和前驅指標.
棧的應用舉例
1. 將10進製正整數num轉換為n進製
private string conversion(int num, int n)
} stringbuilder sb = new stringbuilder();
// 按出棧的順序倒序排列即可
while ((result = mystack.pop()) != null)
return sb.tostring();
}
2. 檢驗符號是否匹配. '['和']', '('和')'成對出現時字串合法. 例如"()", "[[(()())]]"是合法的; "([(])", "[())"是不合法的.
遍歷字串的每乙個char, 將char與棧頂元素比較. 如果char和棧頂元素配對, 則char不入棧, 否則將char入棧. 當遍歷完成時棧為空說明字串是合法的.
public boolean ismatch(string str)
// 配對時c不入棧
else if (temp == '[' && c == ']')
// 配對時c不入棧
else if (temp == '(' && c == ')')
// 不配對時c入棧
else
} return mystack.isempty();
}
使用棧儲存輸入的字元, 如果遇到'#'就將棧頂出棧, 如果遇到@就清空棧. 輸入完成時將棧中所有字元出棧後反轉就是輸入的結果:
private string lineedit(string input) else if (c == '@') else }
stringbuilder sb = new stringbuilder();
character temp = null;
while ((temp = mystack.pop()) != null)
// 反轉字串
sb.reverse();
return sb.tostring();
}
棧的應用舉例
一 目的 掌握棧的表示,實現及其針對棧的各種操作進行具體的應用。二 要求 1 建立乙個順序棧,實現括號配對,判斷乙個表示式中括號配對是否合法。2 當使用者輸入乙個合法的表示式後,能夠返回正確的結果。能夠計算的運算子包括 加 減 乘 除 括號 能夠計算的數要求在實數範圍內。對於異常表示式給出錯誤提示。...
棧的應用舉例
十進位制數n和其他d進製數的轉換是計算機實現計算的基本問題,其解決方法很多,其中乙個簡單演算法基於下列原理 n n div d d n mod d 其中 div為整除運算,mod為求餘運算 例如,2007 10 3727 8,其運算過程如下 可以看到上述過程是從低位到高位產生8進製的各個數字,然後從...
棧和佇列(二) 棧的應用舉例
一 數制轉換 十進位制數n和其它d進製數的轉換是計算機實現計算的基本問題,其解決方法很多,其中乙個簡單的演算法是基於下列原理 n n div d d n mod d。其中 div為整除運算,mod為求餘運算。例 1348 10 2504 8,其運算過程如下 n n div 8 n mod 8 134...