`

重走算法路之数组栈的实现

 
阅读更多

        对待就要来临的期中考试,感觉头好大,看书看不下去的时候就敲敲代码,换个口味,今天敲了一下栈,是用数组实现的,当然也可以用链表来实现。

       栈的最大的特点就是“先进后出”,其实很像我们平时一起交作业,老师批改作业,越早交老师往往是最后才帮你改的,因为你的作业本被别人的作业本压在了下面嘛。但是也有喜欢好学生的老师,他会首先把成绩好的同学的作业或者卷子拿出来改,这样就不是栈的问题了,而是有一个优先级的考虑,也就是“优先级队列结构”。

          栈在计算机系统中的作用很大。主要在两个方面。

  1.函数的返回地址和参数
  2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。
   栈的原理图  :                                        
 
由图可知:
1)从哪进就重哪里出去。
2)先进去的必定是最后才能出去的。
3)有一个东西指向了栈顶的元素。用来对栈中元素进行一些操作。而且总是指在栈顶的元素的。
 
代码实现。注释详细。
package 数组栈的实现;

public class StackX {
	
	 /*
	  *棧的最大容量 
	  */
	 private int maxSize;
	 
	 /*
	  * 存放数据的数组
	  */
	 private long[] stackArray;
	 
	 /*
	  * 指向栈顶元素的下标
	  */
	 private static int top;
	 
	 /*
	  * 构造方法,生成一个数组并初始化栈数组的大小,
	  * 并初始化指向顶部的下标。top = -1,表明栈
	  * 中还没有元素
	  */
	 public StackX(int maxSize) {
		 top = -1;
		 this.maxSize = maxSize;
		 stackArray = new long[maxSize];
	 }
	 
	 /*
	  * 向栈中压入一个元素
	  * top先上移一个位置,再在原来的下标处添加元素
	  * 为的是满栈的时候不会造成栈顶的元素被覆盖
	  */
	 public void push(long value) {
		
		 stackArray[++top] = value;
	 }
    
	 /*
	  * 弹出栈顶的元素,先弹出栈顶的元素
	  * 然后指向栈顶的top再往下移动一个下标,
	  * 这样做的是为了当栈里面只有一个元素的时候
	  * 不会照成最后一个元素pop不出来,因为如果先移动
	  * 栈顶元素,top=-1了,这时默认已经为空了,而实际上
	  * 里面还有一个元素
	  */
	 public long pop() {
		 return stackArray[top--];
	 }
	 
	 /*
	  * 判断栈是否为空,当top==-1的时候,返回true
	  */
	 public boolean isEmpty() {
		 return top==-1;
	 }
	 

     /*
	  * 判断栈是否满了,当top==(maxSize-1)的时候,返回true
	  */
	 public boolean isFull() {
		 return (top >(maxSize-1)); 
	 }
	 
	 /*
	  * 查看栈顶的元素
	  */
	 public long peek() {
		 return stackArray[top];
	 }
	 
	 
	 public static void main(String[] args) {
		 StackX stackX = new StackX(10);
		 //没有压入元素的时候看看栈是不是空的
		 System.out.println("此时栈是不是空的?  "+stackX.isEmpty());
		 //像栈里面压入元素,栈顶的元素应该是最后一个压入的
		 stackX.push(23);
		 stackX.push(13);
		 stackX.push(2);
		 stackX.push(123);
		 stackX.push(233);
		 stackX.push(3);
		 stackX.push(209);
		 
		 //查看栈顶的元素
		 System.out.println("查看栈顶的元素此时栈顶的元素应该为最后压入的那一个: "+stackX.peek());
		 
		 //查看是否栈满了
		 System.out.println("此时栈满了没有? "+stackX.isFull());
		 
		 //弹出两个试试
		 System.out.println("弹出两个元素:");
		 System.out.println("弹出的元素为: "+stackX.pop());
		 System.out.println("弹出的元素为: "+stackX.pop());
		 
		 //再打印栈顶的元素
		 System.out.println("弹出两个元素后栈顶元素变为: "+stackX.peek());
		 
		 
	}
}
  
运行结果:
此时栈是不是空的?  true
查看栈顶的元素此时栈顶的元素应该为最后压入的那一个: 209
此时栈满了没有? false
弹出两个元素:
弹出的元素为: 209
弹出的元素为: 3
弹出两个元素后栈顶元素变为: 233
 
再扯几句:其中需要注意的两个地方就是push()方法,向栈里面压入元素的时候,一定要是先在指向栈顶的top先向上移动一个位置之后再往里面压入(++top)。 这样做是为了当栈已经满了的时候,如果先压入再上移的话,就会把原来栈顶的元素给覆盖掉了pop()弹出元素的时候和压入的时候相反,是先弹出了当前的元素,再往下移动top,相应的操作位(top--),这样是为了当里面只有一个元素的时候,如果是先移动,top指到了-1位置,这是默认为空了,这样最后一个元素就弹不出来了。数组实现的时候还有一个问题就是开始就必须指定了栈的大小,这样在我们push()超过数组的最大容量的时候会有异常抛出,这个可以在操作前先进行判断,确定栈还没满的情况下再往里面压入元素。
 

         

  • 大小: 7.8 KB
2
0
分享到:
评论

相关推荐

    C语言实现一些经典算法,可以免费下载

    标题《C语言实现一些经典算法,可以免费下载》和描述《参加比赛后第一次知道算法这么重要,在网上找过很多算法的资料,这个资料对我最有帮助》表明了本资料是关于使用C语言实现各类经典算法,并且可以免费获取的电子...

    算法解析ACM

    栈和队列是最基本的数据结构之一,它们分别遵循“先进后出”(LIFO)和“先进先出”(FIFO)的原则。 **案例分析:Pku1363—Rails** 题目描述:给定一系列列车进入车站的顺序,以及车站内可用的轨道数量,目标是...

    C程序设计-c常用算法程序集

    在"C程序设计-c常用算法程序集"中,我们可以探索到许多C语言编程中常见的算法实现。这些算法是计算机科学的基础,对于任何想要深入理解编程或提高编程能力的开发者来说,都是必不可少的知识。以下将详细讨论一些可能...

    Java常见100多种算法大全

    这份资源提供了超过100种不同的Java实现,旨在帮助学习者深入理解算法原理,并提高编程技能。以下将详细解释其中涉及的一些重要知识点: 1. **排序算法**: - **冒泡排序**:通过相邻元素比较并交换位置,逐步将...

    数据结构导游代码

    数据结构主要包括数组、链表、栈、队列、树、图等。每种数据结构都有其特定的特性和用途: 1. **数组**:是最基础的数据结构,它是一组相同类型元素的集合,通过索引访问。数组的优点是访问速度快,但插入和删除...

    C常用算法程序集.rar

    《C常用算法程序集》是针对C语言编程者的一个宝贵资源,它包含了各种经典和实用的算法实现。这个压缩包中的文件旨在帮助开发者巩固基础,提高解决实际问题的能力。以下是对压缩包中可能包含的算法及其重要性的详细...

    图的深度广度遍历程序C语言实现

    DFS常使用栈来辅助实现。 2. **广度优先遍历**:BFS是一种层次性的遍历方法,它从起始顶点开始,先访问所有与其相邻的未访问顶点,然后再依次访问它们的邻接点,直到遍历完整个图。BFS通常使用队列来辅助实现。 在...

    javabitset源码-Study:学习

    少有人走的路 数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全二叉树 平衡二叉树 二叉查找树(BST) 红黑树 B,B+,B*树 LSM 树 BitSet 常用算法 计数排序 桶排序 基数排序 二分查找 Java 中的排序...

    数据结构课程设计之迷宫

    在实现这些算法时,通常会用到栈(DFS)或队列(BFS)数据结构。栈是后进先出(LIFO)的数据结构,适合递归操作;队列则是先进先出(FIFO),适用于广度优先搜索。同时,为了记录已探索的节点,避免重复搜索,通常会...

    CC++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验

    - **链接过程**:编译、汇编、链接三步走,理解符号解析和重定位。 - **装载过程**:了解装载器如何将可执行文件映射到内存中。 面试时,不仅需要理解这些概念,还需要能够分析问题、设计解决方案,并能写出高效...

    电子技术基础复习题 (2).doc

    本复习题主要涵盖了电子技术中的数据结构、算法设计以及与之相关的计算机科学基础知识。以下是对各个题目涉及知识点的详细解析: 1. 删除单链表中重复结点:此题考察链表操作和算法设计。首先,我们需要遍历链表,...

    基于JAVA的动画迷宫老鼠课程设计

    这些算法可以用来寻找从起点到终点的路径,同时确保老鼠在迷宫中不走回头路。 6. **数据结构**:在实现迷宫算法时,可能需要使用到数据结构,如栈(用于DFS)或队列(用于BFS)。另外,迷宫本身可以用二维数组或者...

    走迷宫游戏代码(c++开发)

    走迷宫游戏是一种经典的计算机程序设计问题,它通常涉及到路径搜索算法、图形用户界面(GUI)设计以及事件处理。在C++中实现这样的游戏,我们可以从以下几个方面来深入理解相关知识点: 1. **C++基础知识**:C++是...

    java五子棋游戏设计.rar

    例如,开始、重开、悔棋等功能按钮的实现,都需要通过监听事件来响应用户的操作。 3. **人机对战**:这部分涉及到AI(人工智能)算法。简单的人机对战可以通过预设的棋局策略实现,复杂些的则可能使用Minimax算法或...

    Python单机版五子棋.zip

    初级难度可能通过简单的启发式搜索算法,如Minimax或Alpha-Beta剪枝,模拟对手的走法;而高级难度则可能涉及更复杂的搜索策略,比如蒙特卡洛树搜索(MCTS),结合评估函数以提高决策质量。这两种方法都是人工智能在...

    美团校园招聘历年经典面试题汇总:后台开发岗1

    9. **拥塞控制**:网络拥塞控制通过减少发送速率来防止过多的数据同时在网络中传输,常见的算法有慢启动、拥塞避免、快速重传和快速恢复等。 10. **JVM的GC内容**:Java虚拟机的垃圾收集主要包括新生代、老年代的...

Global site tag (gtag.js) - Google Analytics