莊周夢蝶
生活、程序、未來
::
首頁
:: :: ::
聚合
::
管理
數據結構之棧與隊列
Posted on 2007-02-20 12:51
dennis
閱讀(690)
評論(0)
編輯
收藏
所屬分類:
數據結構與算法
一。棧
1。概念:棧(stack)是一種線性數據結構,只能訪問它的一端來存儲或者讀取數據。棧是一種后進先出的結構(LIFO)
2。棧的主要操作:
.clear()——清棧
.isEmpty()——檢查棧是否為空
.push(e)——壓棧
.pop()——出棧
.topEl()——返回棧頂元素
3。棧的java實現:使用數組鏈表實現
/**?*/
/**
?*?
?
*/
package
?com.sohu.blog.denns_zane.stackqueue;
/**?*/
/**
?*?
@author
?dennis
?*?
?
*/
public
?
abstract
?
class
?AbstractStack?
{
????
public
?
abstract
?Object?pop();
????
public
?
abstract
?
void
?push(Object?obj);
????
public
?
abstract
?Object?topEl();
????
public
?
abstract
?
boolean
?isEmpty();
????
public
?
abstract
?
void
?clear();
}
/**?*/
/**
?*?
?
*/
package
?com.sohu.blog.denns_zane.stackqueue;
/**?*/
/**
?*?
@author
?dennis
?*?
?
*/
public
?
class
?Stack?
extends
?AbstractStack?
{
????
private
?java.util.ArrayList?pool?
=
?
new
?java.util.ArrayList();
????
public
?Stack()?
{
????}
????
public
?Stack(
int
?n)?
{
????????pool.ensureCapacity(n);
????}
????
public
?
void
?clear()?
{
????????pool.clear();
????}
????
public
?
boolean
?isEmpty()?
{
????????
return
?pool.isEmpty();
????}
????
public
?Object?topEl()?
{
????????
if
?(isEmpty())
????????????
throw
?
new
?java.util.EmptyStackException();
????????
return
?pool.get(pool.size()?
-
?
1
);
????}
????
public
?Object?pop()?
{
????????
if
?(isEmpty())
????????????
throw
?
new
?java.util.EmptyStackException();
????????
return
?pool.remove(pool.size()?
-
?
1
);
????}
????
public
?
void
?push(Object?el)?
{
????????pool.add(el);
????}
????
public
?String?toString()?
{
????????
return
?pool.toString();
????}
}
4。棧的應用:
1)程序中的匹配分割符,如(,[,{等符號
2)大數的運算,比如大數相加,轉化為字符串,利用棧處理
3)回文字,例子:
/**?*/
/**
?*?
?
*/
package
?com.sohu.blog.denns_zane.stackqueue;
import
?java.io.BufferedReader;
import
?java.io.IOException;
import
?java.io.InputStreamReader;
/**?*/
/**
?*?
@author
?dennis
?*?
?
*/
public
?
class
?HuiWen?
{
????
/**?*/
/**
?????*?
@param
?args
?????
*/
????
public
?
static
?
void
?main(String[]?args)?
{
????????BufferedReader?buffer?
=
?
new
?BufferedReader(
new
?InputStreamReader(
????????????????System.in));
????????
try
?
{
????????????String?str?
=
?buffer.readLine();
????????????
if
?(str?
!=
?
null
)
????????????????isHuiWen(str);
????????}
?
catch
?(IOException?e)?
{
????????????e.printStackTrace();
????????}
????????
//
?TODO?Auto-generated?method?stub
????}
????
public
?
static
?
void
?isHuiWen(String?str)?
{
????????
int
?length?
=
?str.length();
????????
char
[]?ch?
=
?str.toCharArray();
????????Stack?stack?
=
?
new
?Stack();
????????
if
?(length?
%
?
2
?
==
?
0
)?
{
????????????
for
?(
int
?i?
=
?
0
;?i?
<
?length?
/
?
2
;?i
++
)?
{
????????????????stack.push(ch[i]);
????????????}
????????????
for
?(
int
?i?
=
?length?
/
?
2
;?i?
<
?length?
-
?
1
;?i
++
)?
{
????????????????
if
?(ch[i]?
!=
?((Character)?stack.pop()).charValue())?
{
????????????????????System.out.println(
"
不是回文字??!
"
);
????????????????????
return
;
????????????????}
????????????}
????????????System.out.println(str?
+
?
"
是回文字!!
"
);
????????}
?
else
?
{
????????????
for
?(
int
?i?
=
?
0
;?i?
<
?length?
/
?
2
;?i
++
)?
{
????????????????stack.push(ch[i]);
????????????}
????????????
for
?(
int
?i?
=
?(length?
/
?
2
?
+
?
1
);?i?
<
?length?
-
?
1
;?i
++
)?
{
????????????????
if
?(ch[i]?
!=
?((Character)?stack.pop()).charValue())?
{
????????????????????System.out.println(
"
不是回文字??!
"
);
????????????????????
return
;
????????????????}
????????????}
????????????System.out.println(str?
+
?
"
是回文字!!
"
);
????????}
????}
}
4)java虛擬機中的本地方法棧
二。隊列(queue)
1。概念:隊列也是線性結構,從尾部添加元素,從頭部刪除元素。與棧相反,隊列是先入先出結構(FIFO)
2。隊列主要操作:
.clear() ——清空隊列
.isEmpty()——判斷隊列是否為空
.enqueue(el)——從尾部插入元素el
.dequeue()——從隊列中起出第一個元素,并刪除
.firstEl()——返回隊列第一個元素,不刪除。
3。隊列的實現:
1)環形數組:需要考慮隊列已滿的兩種情況,1,第一個元素在最后一個元素之后;2,第一個元素在第一單元,最后一個元素在最后單元。給出一個java實現:
/**?*/
/**
?*?
?
*/
package
?com.sohu.blog.denns_zane.stackqueue;
/**?*/
/**
?*?
@author
?dennis
?*?
?
*/
//
?queue?implemented?as?an?array
public
?
class
?ArrayQueue?
{
????
private
?
int
?first,?last,?size;
????
private
?Object[]?storage;
????
public
?ArrayQueue()?
{
????????
this
(
100
);
????}
????
public
?ArrayQueue(
int
?n)?
{
????????size?
=
?n;
????????storage?
=
?
new
?Object[size];
????????first?
=
?last?
=
?
-
1
;
????}
????
public
?
boolean
?isFull()?
{
????????
return
?first?
==
?
0
?
&&
?last?
==
?size?
-
?
1
?
||
?first?
==
?last?
+
?
1
;
????}
????
public
?
boolean
?isEmpty()?
{
????????
return
?first?
==
?
-
1
;
????}
????
public
?
void
?enqueue(Object?el)?
{
????????
if
?(last?
==
?size?
-
?
1
?
||
?last?
==
?
-
1
)?
{
????????????storage[
0
]?
=
?el;
????????????last?
=
?
0
;
????????????
if
?(first?
==
?
-
1
)
????????????????first?
=
?
0
;
????????}
?
else
????????????storage[
++
last]?
=
?el;
????}
????
public
?Object?dequeue()?
{
????????Object?tmp?
=
?storage[first];
????????
if
?(first?
==
?last)
????????????last?
=
?first?
=
?
-
1
;
????????
else
?
if
?(first?
==
?size?
-
?
1
)
????????????first?
=
?
0
;
????????
else
????????????first
++
;
????????
return
?tmp;
????}
????
public
?
void
?printAll()?
{
????????
for
?(
int
?i?
=
?
0
;?i?
<
?size;?i
++
)
????????????System.out.print(storage[i]?
+
?
"
?
"
);
????}
}
2
)更適合實現隊列的雙向鏈表:
/**?*/
/**
?*?
?
*/
package
?com.sohu.blog.denns_zane.stackqueue;
/**?*/
/**
?*?
@author
?dennis
?*?
?
*/
public
?
class
?Queue?
{
????
private
?java.util.LinkedList?list?
=
?
new
?java.util.LinkedList();
????
public
?Queue()?
{
????}
????
public
?
void
?clear()?
{
????????list.clear();
????}
????
public
?
boolean
?isEmpty()?
{
????????
return
?list.isEmpty();
????}
????
public
?Object?firstEl()?
{
????????
return
?list.getFirst();
????}
????
public
?Object?dequeue()?
{
????????
return
?list.removeFirst();
????}
????
public
?
void
?enqueue(Object?el)?
{
????????list.add(el);
????}
????
public
?String?toString()?
{
????????
return
?list.toString();
????}
}
4。隊列的應用:線性規劃方面
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
一道面試題注記
LinkedList的局限
快速排序及優化
緩存的分代
Project euler 18題解答
os的進程調度(讀書筆記)
java.util.HashMap源碼要點淺析
sicp4.1.1-4.1.5節部分習題嘗試解答(update)
使用Rope來高效處理長字符串
善用表驅動法
Powered by:
BlogJava
Copyright © dennis
公告
關于我
隨筆分類
Android相關
C#歷程(13)
Clojure(43)
erlang(16)
Hadoop與分布式(16)
java(176)
linux & C(25)
my open-source(100)
node.js(5)
unix網絡編程(6)
web開發(13)
動態語言(81)
小毅同學二三事(1)
工作流(5)
工作隨筆(9)
工具和命令(4)
數據庫技術(14)
數據結構與算法(26)
模式與架構(30)
涂鴉(141)
源碼解讀(28)
移動開發(1)
計算機科學與基礎(56)
軟件工程(6)
友情鏈接
About me
Clojure中文技術社區
xmemcached
多背一公斤
夢想風暴
淘寶Java中間件
美味書簽
美味書簽團隊博客
美味愛讀
邢紅瑞的blog
阿寶的blog
阿歡的blog
最新隨筆
1.?博客搬遷
2.?Another URL Shortener using NodeJS
3.?Clojure中文專業技術社區
4.?Ring.velocity:render velocity templates for ring in clojure
5.?Clojure筆記:用好type hint
6.?Clojure世界:利用HouseMD診斷clojure
7.?分布式消息中間件Metaq發布1.4.3
8.?如何熟悉一個開源項目?
9.?Emacs + Clojure配置的幾個Tip
10.?clj.monitor : monitoring applications in clojure based on SSH
搜索
最新評論
1.?vitamind28448
評論內容較長,點擊標題查看
--Good post. I learn something totally new and chall
2.?re: Aviator——讓表達式飛起來
很好用,剛用到最近的一個項目中
--welcomezhang
3.?re: Java字符串的最大長度
寫得很好
--zzz
4.?clashofclanshack1155
Very clean site, thanks for this post.
--Very clean site, thanks for this post.
5.?binaryrobot89773
評論內容較長,點擊標題查看
--Howdy! I simply wish to offer you a big thumbs up
主站蜘蛛池模板:
亚洲精品无码成人
|
五月天婷婷免费视频
|
亚洲国产一级在线观看
|
韩国免费a级作爱片无码
|
777亚洲精品乱码久久久久久
|
毛片a级毛片免费观看免下载
|
日韩大片免费观看视频播放
|
成年女人毛片免费观看97
|
色视频在线观看免费
|
久久99免费视频
|
亚洲乱码无人区卡1卡2卡3
|
亚洲中文字幕无码一区二区三区
|
波多野结衣免费在线观看
|
亚洲第一精品福利
|
免费黄网在线观看
|
嫩草成人永久免费观看
|
亚洲AV无码一区二区三区性色
|
亚洲欧美日韩中文字幕一区二区三区
|
亚洲免费无码在线
|
最近的中文字幕大全免费版
|
国产线视频精品免费观看视频
|
亚洲熟女综合一区二区三区
|
亚洲AV无码专区在线播放中文
|
日韩免费电影在线观看
|
131美女爱做免费毛片
|
亚洲入口无毒网址你懂的
|
亚洲午夜无码久久久久
|
欧洲精品免费一区二区三区
|
久久久久久曰本AV免费免费
|
91在线视频免费观看
|
www亚洲精品久久久乳
|
亚洲一区二区三区深夜天堂
|
亚洲精品乱码久久久久久
|
中文在线免费看视频
|
亚洲乱色熟女一区二区三区蜜臀
|
久久久久亚洲AV成人片
|
亚洲国产精品无码中文字
|
亚洲欧洲日产国码一级毛片
|
日韩免费观看视频
|
最近的免费中文字幕视频
|
无码国产精品一区二区免费式影视
|