`

数据结构-栈

阅读更多

 

: 一个先入后出的有序序列(First In LastOut

限制线性表中的插入和删除只在同一端进行,允许插入和删除的一段叫做栈顶(Top,另外一段叫做栈底(Bottom),所以最先放入的元素在栈底,最后放入的元素在栈顶。

总有一个变量指向栈顶,如果栈为空,那么栈顶变量下标为-1.

常用的场景:

1)子程序的调用,在跳往子程序之前,会将下一个指令的地址存到堆栈中,直到子程序结束再将地址取出,回到原来的程序中。

2)处理递归调用,类似子程序调用,只是除了存储下一个指令的地址外,也将参数,区域变量等数据存入堆栈中

3)表达式的转换与求值

4)二叉树的遍历

5)图的深度优先搜索法(depth-first

 

package com.dataStructure.heapStack;

import javax.swing.Popup;

public class MyStack {
	private int top = -1;//该栈为空
	private int maxSize = 50;//该栈最大容量
	private Object[] stacks = new Object[maxSize];
	/**
	 * 入栈
	 * @param data
	 */
	public void push(Object data){
		//Check stack if max
		if(this.top == maxSize-1){
			System.out.println("该栈已经最大了,不能存放数据了");
			return;
		}
		this.top++;
		this.stacks[this.top] = data;
	}
	/**
	 * 出栈,取栈顶的值
	 */
	public Object pop(){
		if(this.top == -1){
			System.out.println("该栈为空");
			return -1;
		}
		Object topValue = this.stacks[this.top];
		this.top--;
		return topValue;
	}
	public int getResult(int num1, int num2, String operation){
		char[] operationCharArray = operation.toCharArray();
		int result = 0;
		switch (operationCharArray[0]) {
		case '+':
			result = num1 + num2;
			break;
		case '-':
			result = num2 - num1;
			break;
		case '*':
			result = num1 * num2;
			break;
		case '/':
			result = num2 / num1;
			break;
		default:
			break;
		}
		return result;
	}
	public boolean isOperation(String character){
		return character.equals("+") || character.equals("-") || character.equals("*") || character.equals("/");
	}
	
	public boolean isEmpty(){
		return this.top == -1;
	}
	
	public int getOperationPrior(String character){
		return (character.equals("*") || character.equals("/")) ? 1 : 0;
	}
	
	public Object getTopValue(){
		return this.stacks[this.top];
	}
	public void showStack(Object[] stacks){
		if(this.top == -1){
			return;
		}
		for(int x = this.top; x > -1; x--){
			System.out.println("当前第"+x+"元素: "+stacks[x]);
		}
	}
	public static void main(String[] args) {
		MyStack myStack = new MyStack();
		myStack.push(3);
		myStack.push(25);
		myStack.push(12);
		myStack.push(15);
		myStack.pop();

		myStack.showStack(myStack.getStacks());
	}

	public int getTop() {
		return top;
	}

	public void setTop(int top) {
		this.top = top;
	}

	public int getMaxSize() {
		return maxSize;
	}

	public void setMaxSize(int maxSize) {
		this.maxSize = maxSize;
	}
	public Object[] getStacks() {
		return stacks;
	}
	public void setStacks(Object[] stacks) {
		this.stacks = stacks;
	}

	
}

 

package com.dataStructure.heapStack;

public class Calculate {
	private String expression = "100-60/2+2*14/4-12";
	private MyStack numStack = new MyStack();
	private MyStack operationStack = new MyStack();
	
	private void scanExpression(String expression){
		int index = 0;
		while(true){
			//依次取出字符
			String singleCharacter = expression.substring(index, 1);
			//判断singleCharacter是不是运算符
			if(this.operationStack.isOperation(singleCharacter)){
				//如果为空,直接入符号栈
				if(this.operationStack.isEmpty()){
					this.operationStack.push(singleCharacter);
				}else{//表示不为空
					this.operationStack.push(singleCharacter);
					int currentOperation = this.operationStack.getOperationPrior(singleCharacter);
					
					int topOperation = Integer.valueOf((String)this.operationStack.getTopValue());
					if(currentOperation <= topOperation){
						//数栈弹出两个数,
						int num1 = Integer.valueOf((String)this.numStack.pop());
						int num2 = Integer.valueOf((String)this.numStack.pop());
						String operationTop = (String)this.operationStack.pop();
						int result = this.numStack.getResult(num1, num2, operationTop);
						this.numStack.push(result);
					}
				}
			}else{
				//如果是数字就入数栈
				this.numStack.push(singleCharacter);
			}
			index++;
			//check if complete the scan
			if(index == this.expression.length()){
				break;
			}
		}
	}
}

 

  • 大小: 2.6 KB
分享到:
评论

相关推荐

    Educoder题目:数据结构-栈基本运算的实现及其应用答案解析.md

    Educoder题目:数据结构-栈基本运算的实现及其应用答案解析.md

    数据结构-栈.zip_数据结构-栈

    标题“数据结构-栈.zip_数据结构-栈”暗示了这个压缩包文件主要包含了关于数据结构中栈的讲解和示例。通过解压并分析其中的文件,我们可以进一步了解栈的基本概念和操作。 “栈测试.cpp”很可能是一个用C++编写的源...

    数据结构-栈的C语言实现

    数据结构-栈的C语言实现,随手笔记

    C++实现数据结构-栈

    C++实现数据结构-栈

    java基础数据结构-栈

    ### Java基础数据结构—栈 #### 一、栈的基本概念 栈作为一种常见的数据结构,在计算机科学领域具有重要的地位。在《Java基础复习笔记05数据结构-栈》中提到,**栈**是一种特殊的线性表,它遵循“先进后出”...

    数据结构-栈的应用-迷宫求解

    数据结构在计算机科学中扮演着至关重要的角色,而栈作为一种特殊的数据结构,其“后进先出”(LIFO)的特性使得它在许多问题中都有广泛应用。在本主题“数据结构-栈的应用-迷宫求解”中,我们将探讨如何利用栈来解决...

    3.C-数据结构-栈源码

    3.C-数据结构-栈源码

    数据结构-栈和队列-PPT

    "数据结构-栈和队列-PPT" 数据结构中栈和队列是两种常用的线性表结构,下面对它们的定义、特点和应用进行详细介绍。 栈的定义和特点 栈是一种只能在一端(栈顶)进行插入和删除运算的线性表。栈的逻辑结构与...

    Java基础复习笔记05数据结构-栈

    Java基础复习笔记05数据结构-栈,详细介绍了栈的相关知识

    数据结构-栈与队列.zip

    在这个"数据结构-栈与队列.zip"的压缩包中,包含了几个关键的知识点,它们都是基于两个基本的数据结构——栈(Stack)和队列(Queue)来展开的。下面将对每个主题进行详细的解释。 1. 栈:栈是一种具有“后进先出”...

    数据结构-栈的实现代码(C语言版).rar

    数据结构 -- C语言版 -- 栈的部分实现代码(栈的实现、栈的应用),详细介绍参考数据结构--栈的系列博文。链接为:https://blog.csdn.net/songshuai0223/category_9742561.html。

    数据结构-栈的实现

    栈是一种特殊类型的数据结构,被称为“后进先出”(LIFO)结构。这意味着最后存入的数据最先被取出,就像堆叠盘子一样。在这个“数据结构-栈的实现”主题中,我们将深入探讨栈的概念、它的操作以及如何通过代码来...

    C语言-数据结构-栈队列实现

    本主题关注的是如何使用C语言来实现数据结构中的栈和队列,这是两种基础但非常重要的抽象数据类型(ADT)。 栈(Stack)是具有后进先出(LIFO)特性的数据结构。它类似于一个堆叠的盘子,最新的元素被放在顶部,...

    数据结构-栈的顺序存储

    在这个主题中,我们将深入探讨一种特殊的数据结构——栈(Stack),特别是它的顺序存储实现方式。栈是一种后进先出(Last In, First Out,简称LIFO)的数据结构,常被比喻为一叠盘子,新加入的盘子总是在最上面,要...

    数据结构-栈和队列.ppt

    对线性表 L=(a1,a2,,...,an), 可在任意第i(i=1,2,,...n,n+1)个位置插入新元素, 或删除任意第i(i=1,2,,...n)个元素 受限数据结构---- 插入和删除受限制的线性表。 1.栈(stack), 2.队列(queue)

    Java语言编写的数据结构-栈实现

    在这个主题中,我们将深入探讨如何在Java中实现栈这一基本数据结构,具体包括顺序栈(stack_SqStack)和链栈(stack_SLinkList)。 栈是一种后进先出(Last In First Out, LIFO)的数据结构,常用于临时存储和快速...

    数据结构---栈和队列之共享栈(C语言)

    数据结构---栈和队列之共享栈(C语言)完整代码,可以运行

    Java数据结构-栈

    栈(Stack)是其中一种基础且常用的数据结构,它遵循“后进先出”(Last In First Out, LIFO)原则。 栈是一种线性的数据结构,其特点是只能在结构的一端进行插入和删除操作,这一端被称为栈顶。在栈中,新添加的...

Global site tag (gtag.js) - Google Analytics