用顺序映像实现栈
2019-03-11 09:44:32来源:博客园 阅读 ()
(一).栈的理解
(1)概述:只在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有特殊含义,我们称之为栈顶(top),表头我们称之为栈底(bottom)。不含元素的空表称之为空栈.
(2)栈的顺序映像:植栈中元素实际在数组中存储,其线性关系,与普通线性表相同,通过元素紧邻来表示。
a.入栈:
这里要注意的只有一点,就是数组容量的问题,在元素入栈的时候,要保证数组中有位置来容纳,带入栈的元素
b.出栈:
这里要注意的也只有一点就是,此时,栈是否为空栈,如果是空栈,就无法出栈。
(二)代码实现
(1)首先定义一个Stack接口
public interface Stack<T> {
//返回栈的长度
public int length();
//入栈
public void push(T elment);
//出栈
public T pop();
//取栈顶
public T peek();
//判断栈空
public boolean isEmpty();
//清空栈
public void clear();
}
(2)然后定义一个SequeceStack类实现Stack接口
public class SequeceStack<T> implements Stack<T> {
private int DEFAULT_SIZE = 3;//定义栈默认初始长度
private int capacity;//顺序栈的容量
private int size ;//顺序栈中元素个数
private static String[] elements;//定义一个数组用于保存顺序栈中的元素
public SequeceStack() {
capacity = DEFAULT_SIZE;
elements = new String[capacity];
}
/**
* 以指定的容量来初始化栈
* @param initsize 指定的容量
*/
public SequeceStack(int initsize) {
if(initsize < 0 || initsize > Integer.MAX_VALUE-8){
throw new OutofSizeException("容量不合法");
}
else{
int capacity = 1;
while ( capacity < initsize){
capacity <<= 1;
}
elements = new String[capacity];
this.capacity = capacity;//caution扩容的关键
}
}
///////////////////// 下面是栈的各项功能 /////////////////////
/**
* 获取栈中元素个数
* @return 获取的元素个数
*/
@Override
public int length() {
return size;
}
/**
* 入栈
* @param s 要入栈的元素
*/
@Override
public void push(T s) {
//判断是否需要扩容
ensureCapacity(size + 1);
elements[size++] = (String) s;
}
private void ensureCapacity(int minCapacity) {
//是否需要扩容
if(minCapacity > capacity){
//需要扩容
while (minCapacity < capacity){
minCapacity <<= 1;
}
//将旧数组的所有元素拷贝到扩容后的新数组
elements = Arrays.copyOf(elements,minCapacity);
}
}
/**
* 出栈
* @return 出栈的那个元素
*/
@Override
public T pop() {
if(isEmpty()){
throw new ArrayIndexOutOfBoundsException("栈为空");
}else {
T oldValue = (T) elements[size - 1];
elements[--size] = null;
return oldValue;
}
}
/**
* 获取栈顶元素
* @return 获取到的栈顶元素
*/
@Override
public T peek() {
if(size == 0){
throw new ArrayIndexOutOfBoundsException("这是个空栈");
}
return (T) elements[size - 1];
}
/**
* 判断栈是否为空
* @return 如果栈为空,返回ture,否则返回false
*/
@Override
public boolean isEmpty() {
return size == 0;
}
/**
* 清空栈
*/
@Override
public void clear() {
for (int i = 0; i < size; i++) {
elements[i] = null;
}
size = 0;
}
/**
* 打印栈所有元素
* @return 打印的内容
*/
@Override
public String toString() {
if(size == 0){
return "[]";
}else {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elements[i] + ", ");
}
int len = sb.length();
return sb.delete(len - 2,len).append("]").toString();
}
}
}
(3)最后定义一个测试类
public class SequenceStackTest {
public static void main(String[] args) {
SequeceStack ss = new SequeceStack();
System.out.println("-------------初始化一个空栈-------------");
System.out.println("栈空:" + ss.isEmpty());
System.out.println("打印栈:" + ss.toString());
System.out.println("栈中元素个数:" + ss.length());
System.out.println("-------------存储三个元素后-------------");
ss.push("hello");
ss.push("world");
ss.push("java");
System.out.println("栈空:" + ss.isEmpty());
System.out.println("打印栈:" + ss.toString());
System.out.println("栈中元素个数:" + ss.length());
System.out.println("-----------获取栈顶元素,但不删除栈顶元素-----------");
System.out.println("获取到的栈顶元素为:" + ss.peek());
System.out.println("打印栈:" + ss.toString());
System.out.println("栈中元素个数:" + ss.length());
System.out.println("-------------将栈顶元素出栈----------------");
System.out.println("栈顶出栈的元素为:" +ss.pop());
System.out.println("打印栈:" + ss.toString());
System.out.println("栈中元素个数:" + ss.length());
System.out.println("-------------清空栈---------------");
ss.clear();
System.out.println("栈空:" + ss.isEmpty());
System.out.println("打印栈:" + ss.toString());
System.out.println("栈中元素个数:" + ss.length());
System.out.println("-------------当存储元素个数大于4个元素时,需要扩容-------------");
ss.push("hello");
ss.push("world");
ss.push("java");
ss.push("chongqing");
System.out.println("打印栈:" + ss.toString());
System.out.println("栈中元素个数:" + ss.length());
}
}
(4)当然,这里我自己自定义了一个异常
public class OutofSizeException extends RuntimeException {
public OutofSizeException() {
}
public OutofSizeException(String message) {
super(message);
}
}
(5)运行结果:
原文链接:https://www.cnblogs.com/bug-baba/p/10509926.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后 2020-06-10
- Spring Boot 实现定时任务的 4 种方式 2020-06-10
- JSP+SSH+Mysql+DBCP实现的租车系统 2020-06-09
- Java实现的三种字符串反转 2020-06-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash