用数组写出栈(先进后出)

<pre name="code" class="java">//用数组写出栈(先进后出)

import java.util.Collection; import java.util.NoSuchElementException; public class ArrayStack<E> { private int initalSize = 5; private Object[] stack; private int head; private int tail; public ArrayStack() { initialize(null); } public ArrayStack(int newcapacity){
if (newcapacity < this.initalSize) throw new IllegalArgumentException("The new capacity is too small!"); initalSize = newcapacity; initialize(null); } public ArrayStack(E[] items) { initialize(items); } public ArrayStack(Collection<E> collection) { initialize(collection.toArray());
} private void initialize(Object[] items){ if (items == null || items.length == 0){ stack = new Object[initalSize]; head = 0; tail = 0; } else{ stack = new Object[items.length + 1]; System.arraycopy(items, 0, stack, 0, items.length); head = items.length; tail
= 0; } } @SuppressWarnings("unchecked") public E pop(){ if (size() == 0) throw new NoSuchElementException(); if (head == 0) head = stack.length; Object ret = stack[--head]; loseWeight(); return (E)ret; } public void push(E item){ increaseWeight(); stack[head++]
= item; if (head == stack.length) head = 0; } @SuppressWarnings("unchecked") public E peek(){ if (size() == 0) throw new NoSuchElementException(); if (head == 0) return (E)stack[stack.length - 1]; else return (E)stack[head-1]; } public boolean isEmpty(){ return
(size() == 0); } public int size(){ return head >= tail ? head - tail : head + stack.length - tail; } public boolean increaseWeight(){ if (size() == stack.length - 1){ Object[] newStack = new Object[stack.length * 2]; System.arraycopy(stack, 0, newStack, 0,
stack.length); stack = newStack; return true; } return false; } public boolean loseWeight(){ if (size() == stack.length / 4){ Object[] newStack = new Object[stack.length/2]; if (head >= tail){ System.arraycopy(stack, tail, newStack, 0, size()); } else{ System.arraycopy(stack,
tail, newStack, 0, stack.length-tail); System.arraycopy(stack, 0, newStack, stack.length-tail, head); } tail = 0; head = size(); return true; } return false; } }


时间: 2024-10-26 22:56:35

用数组写出栈(先进后出)的相关文章

将字节数组写出到文件的两种方式

方式1.ByteArrayInputStream public static void writeBytesToFile() throws IOException{ String s = "Some text"; byte[] bs= s.getBytes(); OutputStream out = new FileOutputStream("aaa.txt"); InputStream is = new ByteArrayInputStream(bs); byte

进栈和出栈

栈(stack)和队列(queue): 其实都是普通数组,只不过调用了不同API而已 栈: 一端封闭,只能从另一端进出的数组 FILO 何时使用: 希望始终使用最新进入数组的元素时 如何使用: 1. 从结尾出入栈 入栈(压栈): arr.push(值1,值2,...) 不支持数组参数 出栈(弹栈): var last=arr.pop(); 好处: 无论出入栈都不改变剩余元素的位置 2. 从开头出入栈 入栈: arr.unshift(值1,值2,...) unshift入栈的顺序值从右向左读取参数

写一个算法判断出栈顺序是否正确

入栈的数据:1234567 解决思路: 简单的模拟出栈入栈操作,将元素依次入栈.然后根据输入的次序依次出栈.比如给出的出栈次序是 1 4 3 7 6 2 5,首先将1入栈,发现输入数据 中的第一个正好是1.将1出栈,下面是4,由于栈是空,并且刚才只把1入栈,接下来将2 3 4依次入栈,些时栈顶元素是4,与输入数据的第二个元素相 等,将4出栈.然后3出栈,接下来处理7,由于此时栈顶元素是2,7大于2所以接下来将5 6 7依次入栈(栈中元素为7 6 5 2).然后栈顶元素与 输入数据的7比较相等,7

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

n个元素进栈,共有多少种出栈顺序?

原文:http://blog.csdn.net/zyearn/article/details/7758716 近日在复习数据结构,看到栈的时候,发现1个元素进栈,有1种出栈顺序:2个元素进栈,有2种出栈顺序:3个元素进栈,有5种出栈顺序,那么一个很自然地问题就是n个元素进栈,共有多少种出栈顺序? 说来惭愧,以前学数据结构的时候竟然没有考虑过这个问题.最近在看动态规划,所以“子问题”这3个字一直在我脑中徘徊,于是解决这个问题的时候我也是用类似“子问题”的方法,说白了就是递推公式. 我们把n个元素的

1002. 写出这个数 (20)

读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格. 输入样例: 1234567890987654321123456789 输出样例: yi san wu 1.如何把字符类型里的每一个数字分离出来,有很多种方法 String str=sc.next().trim(); String b=

数据结构经典问题——出栈顺序 转载至:canlynet微博

对于数据结构的问题,如果思路稍有不对,就容易陷入逻辑混乱.我希望自己对数据结构的理解,能够给大家一点帮助.我会将所有我有过心得的问题在我的博客上写出来,欢迎大家浏览,如果有什么不对的地方,还请大家指正,有问题可以给我留言,我会尽量解决,谢谢. 声明一下我写博客的初衷:不是炫耀,而是回报.因为我在计算机方面的知识好多都从网上找到答案,因此我也 将自己搜寻整理的材料,自己写的材料,展示到网上,算是尽一份力吧. 一个经典问题如下(不愿意看思路的可以直接看红色字体部分): 一个栈的入栈序列是a,b,c,

【火车出栈】ZOJ - 2603 Railroad Sort

好久没写递归了,怕手生再来练练手. 题意:车轨上有上图所示的n个中转栈,现有2n个列车,给出列车初始编号序列.列车从最右边驶入车轨,并且列车只能从右向左移动,要求给出列车中转操作序列,使列车经过这n个中转栈后从最左端输出时满足1~2n的排列. 分析:其实这不就是火车出栈问题吗,可以用分治递归的思路,首先使一半有序,然后再合并使整体有序. 思路:具体来讲就是,一段无序的序列(编号1~2n),通过一个中转栈使1 ~ 2n-1在整个序列的前面2n-1+1 ~ 2n在整个序列的后面:再经过下一中转栈时,