Java数据结构和算法(四)——栈
stack,中文翻译为堆栈,事实上指的是栈,heap,堆。
这里讲的是数据结构的栈,不是内存分配里面的堆和栈。
栈是先进后出的数据的结构,好比你碟子一个一个堆起来。最后放的那个是堆在最上面的。
队列就是排队买苹果。先去的那个能够先买。
栈
public class Stack {
private int array[];
private int max;
private int top;
public Stack(int max){
this.max = max;
array = new int[max];
top = 0;
}
public void push(int value){
if(isFull()){
System.out.println("full,can not insert");
return;
}
array[top++]=value;
}
public int pop(){
return array[--top];
}
public boolean isEmpty(){
if(top == 0){
return true;
}
return false;
}
public boolean isFull(){
if(top == max ){
return true;
}
return false;
}
public void display(){
while(!isEmpty()){
System.out.println(pop());
}
}
public static void main(String[] args) {
Stack s = new Stack(5);
s.push(1);
s.push(3);
s.push(5);
s.push(5);
s.push(5);
s.display();
}
}
事实上还是认为设置top为-1好计算一点。记住这里的i++和++i,假设i=1,那么array[i++]=2,指的是array[1]=2,下次用到i的时候i的值才会变2。而++i就是直接使用i=2。
top指向0,由于每次都push一个元素加一。那么加入到最后一个元素的时候top=max。由于先进后出。那么先出的是最后进的,刚刚为top-1所在的位置。
正确输出:
5
5
5
3
1
一、栈的使用——单词逆序。
public String reverse(String in){
String out="";
for (int i = 0; i < in.length(); i++) {
char c = in.charAt(i);
push(c);
}
while(!isEmpty()){
out+=pop();
}
return out;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String string = s.nextLine();
Stack st = new Stack(string.length());
System.out.println(st.reverse(string));
}
将Stack的数组类型改为char就可以。
读取输入也能够用IO读取。
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader b = new BufferedReader(is);
String string="";
try {
string = b.readLine();
} catch (IOException e) {
e.printStackTrace();
}
Stack st = new Stack(string.length());
System.out.println(st.reverse(string));
}
二、栈的使用——分隔符匹配。
public int charat(char c){
for (int i = 0; i < array.length; i++) {
if(c == array[i])
return i;
}
return array.length;
}
public void match(String in){
String out="";
for (int i = 0; i < in.length(); i++) {
char c = in.charAt(i);
if(c == '{' || c == '(' || c == '[' ){
push(c);
}
if(c == '}' || c == ')' || c == ']'){
char temp = pop();
if(c == '}' && temp != '{'|| c == ')' && temp != '('|| c == ']' && temp != ']'){
System.out.println("can not match in "+i);
}
}
}
while(!isEmpty()){
char c = pop();
if(c == '{'){
System.out.println("insert } to match "+charat(c));
}
if(c == '[' ){
System.out.println("insert ] to match "+charat(c));
}
if(c == '(' ){
System.out.println("insert ) to match "+charat(c));
}
}
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String string = s.nextLine();
Stack st = new Stack(string.length());
st.match(string);
}
result:
klsjdf(klj{lkjjsdf{)
can not match in 19
insert } to match 1
insert ) to match 0
将({[先压入栈,一旦遇到)}]便与弹出的元素比較,若吻合。则匹配。假设一直没有)}],最后便会弹出栈的左符号,提示是在详细哪个位置,缺少的详细的右符号类型。
这是能够用栈来实现的工具。
栈中数据入栈和出栈的时间复杂度为常数O(1),由于与数据个数无关,直接压入弹出。操作时间短。优势便在这里。假设现实生活的使用仅仅需用到先进后出的顺序并且仅仅用到进出数据的比較,那就能够使用栈了。
Java数据结构和算法(四)——栈的更多相关文章
- Java数据结构和算法(四)--链表
日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...
- Java数据结构和算法(一)--栈
栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
- Java数据结构与算法(2):栈
栈是一种线性表,特点在于它只能在一个位置上进行插入和删除,该位置是表的末端,叫做栈的顶(top).因此栈是后进先出的(FIFO).栈的基本操作有push.peek.pop. 栈的示意图 进栈和出栈都只 ...
- Java数据结构和算法(五)——队列
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...
- Java数据结构和算法(六)--二叉树
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
随机推荐
- 团队Alpha版本冲刺(三)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最 ...
- Unity 脚本<2>
UnityEngine; using System.Collections; public class PlayerControl : MonoBehaviour { [HideInInspector ...
- 目标检测算法SSD在window环境下GPU配置训练自己的数据集
由于最近想试一下牛掰的目标检测算法SSD.于是乎,自己做了几千张数据(实际只有几百张,利用数据扩充算法比如镜像,噪声,切割,旋转等扩充到了几千张,其实还是很不够).于是在网上找了相关的介绍,自己处理数 ...
- 【转】网页游戏能用PHP做后端开发吗? PHP Libevent扩展安装及应用
网页游戏能用PHP做后端开发吗? 当然可以.最好走HTTP,也可以做网络编程,而且写代码超简单,1个函数就可以建一个服务器端.stream_socket_server()多线程不是什么好主意,你可以用 ...
- 12小时制时间&&24小时制时间
今天在获取时间的时候发现,插入到数据库中的时间,其中下午的时间直接显示01,02的样子...查了下资料发现了端倪, java.text.SimpleDateFormat f=new java.text ...
- BZOJ2555 SubString 【后缀自动机 + LCT】
题目 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 输入 ...
- make gif pic
http://www.cockos.com/licecap/ licecap 1.open licecap 2.record ,make a pic filename,like pic1 3.work ...
- 将扁平化的JSON属性转换为嵌套的JSON
需要将如下JSON {"a":"a","b":"b","c.e":"e",&qu ...
- repeater做成gridview【更新删除编辑等】
原文发布时间为:2009-06-14 -- 来源于本人的百度文章 [由搬家工具导入] 不多说,不会说。。看我做的范例。。。 http://download.csdn.net/source/138556 ...
- Android解析XML之SAX解析器
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件 ...