庄周梦蝶,孰蝶是我,我是孰蝶?一梦至今,蝶我已难分
首页
新随笔
联系
聚合
管理
随笔-281 评论-277 文章-7 trackbacks-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。队列的应用:线性规划方面
posted on 2007-02-20 12:51
dennis
阅读(189)
评论(0)
编辑
收藏
所属分类:
数据结构与算法
新闻频道
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子技术博客
相关文章:
sicp4.1.1-4.1.5节部分习题尝试解答(update)
使用Rope来高效处理长字符串
善用表驱动法
关于binary search
位图排序
简单LRU算法实现缓存-update2
模仿st_table写的StTable类
scheme实现huffman编码的完整代码
sicp 2.4节小题尝试解答
C#实现二叉查找树
热爱编程,从事Java、Ruby开发,关注java、ruby、web开发、高性能网络编程和FP等方面,有兴趣的一起探讨,我的gmail:
输入您的搜索字词
提交搜索表单
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
C#历程(13)
erlang(12)
java(66)
linux & C(19)
my open-source(23)
Prolog(2)
web开发(13)
动态语言 & rails(48)
工作流(5)
数据库技术(13)
数据结构与算法(19)
涂鸦(67)
源码解读(15)
计算机科学与基础(32)
设计模式(16)
软件工程(2)
随笔档案
2008年7月 (2)
2008年6月 (10)
2008年5月 (11)
2008年4月 (13)
2008年3月 (10)
2008年2月 (12)
2008年1月 (10)
2007年12月 (2)
2007年11月 (6)
2007年10月 (11)
2007年9月 (19)
2007年8月 (11)
2007年7月 (20)
2007年6月 (16)
2007年5月 (16)
2007年4月 (25)
2007年3月 (35)
2007年2月 (52)
文章分类
java(6)
ruby & rails(1)
友情链接
BIGN's blog
云之远
坏男孩
锋爷的blog
偶像
资源类
canonical
非常有思考价值的blog
javaeye
Max的struts2.0
swfheader
TopLanguage
一帮大流氓
rails的学习站点
梦想风暴
电子书下载
负暄琐话
最新随笔
1. 工作上的几个tip