庄周梦蝶
生活、程序、未来
::
首页
:: :: ::
聚合
::
管理
数据结构之栈与队列
Posted on 2007-02-20 12:51
dennis
阅读(677)
评论(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新闻
知识库
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