Java中栈结构的自我实现
package com.pinjia.shop.common.collection; /**
* Created by wangwei on 2017/1/3.
*/
public class MyLinkedStack<T> {
//定义节点数据结构
private class Node{
public T data;
public Node next;
public Node(){}
public Node(T data,Node next){
this.data = data;
this.next = next;
}
} //栈顶元素
private Node top;
//元素个数
private int size;
//插入元素
public void push(T element){
top = new Node(element,top);
size++;
}
//出栈操作
public T pop(){
Node oldNode = top;
top = top.next;
//释放引用
oldNode.next = null;
size--;
return oldNode.data;
} //返回栈顶元素,但不出栈
public T peek(){
return top.data;
} //栈长度
public int length(){
return size;
} //判断链栈是否为空栈
public boolean empty(){
return size == 0;
} public String toString(){
//链栈为空时
if(empty())
return "[]";
else{
StringBuilder sb = new StringBuilder("[");
for(Node current = top;current != null;current = current.next){
sb.append(current.data.toString()+", ");
}
int len = sb.length();
return sb.delete(len-2,len).append("]").toString();
}
}
public static void main(String[] args) {
MyLinkedStack<String> stack = new MyLinkedStack<String>();
// 不断地入栈
stack.push("aaaa");
stack.push("bbbb");
stack.push("cccc");
stack.push("dddd");
System.out.println(stack);
// 访问栈顶元素
System.out.println("访问栈顶元素:" + stack.peek());
// 弹出一个元素
System.out.println("第一次弹出栈顶元素:" + stack.pop());
// 再次弹出一个元素
System.out.println("第二次弹出栈顶元素:" + stack.pop());
System.out.println("两次pop之后的栈:" + stack);
}
}
以下是基于数组的实现:
package com.pinjia.shop.common.collection; /**
* Created by wangwei on 2017/1/3.
*/
public class MyArrayStack<T> {
private Object[] objs = new Object[16];
private int size = 0; public boolean isEmpty() {
return size == 0;
} public void clear() {
// 将数组中的数据置为null, 方便GC进行回收
for (int i = 0; i < size; i++) {
objs[size] = null;
}
size = 0;
} public int length() {
return size;
} public boolean push(T data) {
// 判断是否需要进行数组扩容
if (size >= objs.length) {
resize();
}
objs[size++] = data;
return true;
} /**
* 数组扩容
*/
private void resize() {
Object[] temp = new Object[objs.length * 3 / 2 + 1];
for (int i = 0; i < size; i++) {
temp[i] = objs[i];
objs[i] = null;
}
objs = temp;
} public T pop() {
if (size == 0) {
return null;
}
return (T) objs[--size];
} public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MyArrayStack: [");
for (int i = 0; i < size; i++) {
sb.append(objs[i].toString());
if (i != size - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
} public static void main(String[] args) {
MyArrayStack<Integer> stack = new MyArrayStack<Integer>();
stack.push(12);
stack.push(13);
System.out.println(stack.length());
System.out.println(stack);
}
}
Java中栈结构的自我实现的更多相关文章
- java中栈内存与堆内存(JVM内存模型)
java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...
- java中内存结构及堆栈详解
一. java内存结构 1. Heap(堆):实例分配的地方,通过-Xms与-Xmx来设置 2. MethodArea(方法区域):类的信息及静态变量. 对应是Permanet Generation, ...
- 用Java实现栈结构
栈是一种先进后出的数据结构,出栈入栈都是操作的栈顶元素,下面是利用Java语言实现的一个简单的栈结构 class MyStack{ private int size;//栈大小 private Obj ...
- C++中栈结构建立和操作
什么是栈结构 栈结构是从数据的运算来分类的,也就是说栈结构具有特殊的运算规则,即:后进先出. 我们可以把栈理解成一个大仓库,放在仓库门口(栈顶)的货物会优先被取出,然后再取出里面的货物. 而从数据的逻 ...
- Java中的结构语句
目录 循环语句 While循环 do...While循环 for循环 增强型for语句 条件语句 if..else语句 if...else if...else 语句 嵌套的 if-else 语句 sw ...
- Java中栈的应用,括号匹配
package edu.yuliang.Data_Structure_Basics; import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; /* 给 ...
- Java中栈和堆讲解
之前对JVM中堆内存和栈内存都是一直半解,今天有空就好好整理一下,用作学习笔记. 包括Java程序在内,任何程序在运行时都是要开辟内存空间的.JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区 ...
- Java 模拟栈结构
栈和队列: 通常是作为程序猿的工具,用于辅助构思算法.生命周期较短,执行时才被创建 訪问受限.在特定时刻,仅仅有一个数据可被读取或删除 是一种抽象的结构.内部的实现机制.对用户不可见.比方用数组.链表 ...
- java中的结构--switch选择结构
if-switch 选择结构 switch结构可以更好的解决等值判断问题switch 选择结构的语法:switch (表达式){ case 常量 1: //代码块1: break; case 常量 2 ...
随机推荐
- hihocoder 1196 高斯消元.二
传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其他的活动. 店主:买了 ...
- eclipse中新建python项目报错:Project interpreter not specified
eclipse-windows-preferences-python
- POJ2586Y2K Accounting Bug(贪心 + 不好想)
Y2K Accounting Bug Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12251 Accepted: 62 ...
- Laravel教程 八:queryScope 和 setAttribute
Laravel教程 八:queryScope 和 setAttribute 此文章为原创文章,未经同意,禁止转载. Laravel Eloquent Database 直接就是按照上一节所说的那样,我 ...
- Machine Learning Methods: Decision trees and forests
Machine Learning Methods: Decision trees and forests This post contains our crib notes on the basics ...
- centos7中systemctl命令使用方法和心得体会
使用linux的同学对service和chkconfig两个命令都不陌生,其重要性不言而喻,那么怎么会突然冒出个systemctl命令呢?其实,为了简化操作,systemctl命令将service和c ...
- DS_Store 是什么文件
转自:http://blog.csdn.net/benbenxiongyuan/article/details/9010653 在xcode中,进行svn管理的时候,会发现一个DS_Store文件,这 ...
- 推迟调用以及Lambda表达式
背景 GMock 我们项目中现在的模块测试框架使用了CATCH+GMock的方式实现回归测试和打桩. GMock的介绍在官网上有,这里为了铺垫,大概地描述一下GMock能实现的效果.大约可以看成这样: ...
- iOS 工作遇到问题记录
iOS 工作遇到问题记录 1.UITableView的scrollDelegate问题 下午遇到一个奇怪的问题,之前都没有注意过,由于A VC中要实现tableView和其他View位置的联动,所以实 ...
- XML做下拉列表
5-18X.php主页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...