关于堆栈的计算!

作者&投稿:聊贷 (若有异议请与网页底部的电邮联系)
java 用栈实现((a+b)+c)计算~

楼主您好!
友情提示:
一.在复制代码前需要自己添加类。
二.调用方法都为静态,请你仔细查看代码并以修改。
三.注意我的包名。
ParseExpression.calculateExp(postExperssion.toString());
请把上句的引用改为你的类名。
代码欣赏:

package com.qs.impStackCode;

public class Stack {

/**
* @param args
*/
private int maxsize;
int[] stackArray;
int top = -1;

public Stack(int s){
maxsize = s;
stackArray = new int[maxsize];
}

protected void push(int value){
if(top >= maxsize)
System.out.println("您存放的存储空间栈已经装满了。");
else
stackArray[++top] = value;
}

protected int pop(){
if(top < 0){
System.out.println("当前的栈无数据,已经空了。");
return -1;
}
return stackArray[top--];
}

public long peek(){
return stackArray[top];
}

protected boolean isEmpty(){
return (top == -1);
}

protected boolean isFull(){
return (top == maxsize - 1);
}

//判断操作符号
public boolean isOperator(int operator){
if(operator == 42 || operator == 43 ||
operator == 45 || operator == 47 ||
operator == 41 || operator == 40)
return true;
else
return false;
}

//设置操作符的优先级
public int priority(int operator){
if(operator == 43 || operator == 45 || operator == 40)
return 1;
else if(operator == 42 || operator == 47)
return 2;
else
return 0;
}

public int result(int operator, int operand1, int operand2){
switch(operator){
case 43:
return (operand2 + operand1);
case 45:
return (operand2 - operand1);
case 42:
return (operand2 * operand1);
case 47:
return (operand2 / operand1);
}
return 0;
}
}
以上是栈类。
以下是逻辑类。

package com.qs.impStackCode;

import java.io.*;

public class ParseExpression {

/**
* @param args
*/
protected static String getStr() throws IOException{
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
return read.readLine();
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Stack operator = new Stack(20);
String experssion = null;
//由于我们在数学应中采用都是前序表达所以不得不把它转换成后序或是中序便于处理,
//所以你在代码中看到的postExperssion.append()就是解析好后的后序表达式
StringBuffer postExperssion = new StringBuffer();
int position = 0;
int operator1;
System.out.print("请您输入前序表达试:");
/*
* 读取的是操作数就直接输出。读取的是运算符,该运算符是左括号 ‘(’就把运算符临时存
* 于堆栈中等到循环过程中遇见‘)’就把运算符号从堆栈中取出来。
* 若该运算符不是括号‘()’那么就对操作符“+ - * \/”号进行比较,当前比较的运算符号较低时
* 就停致备用,和下个运算符号进行比较,如果相反则存入堆栈中。直到所有算术式解析完为止
*/
try {
experssion = ParseExpression.getStr();
while(true){
//判断是否是运算符
if(operator.isOperator((int) experssion.charAt(position))){
if(operator.top == -1 || (char) experssion.charAt(position) == '('){
//把运算符存入堆栈中
operator.push(experssion.charAt(position));
}else{
if((char) experssion.charAt(position) == ')'){
//取出运算符直到去出'('
if(operator.stackArray[operator.top] != 40){
operator1 = operator.pop();
postExperssion.append((char)operator1);
}
}else{
if(operator.priority((int) experssion.charAt(position))
<= operator.priority(operator.stackArray[operator.top]) &&
operator.top != -1){
operator1 = operator.pop();
if(operator1 != 40)
postExperssion.append((char)operator1);
}
operator.push(experssion.charAt(position));
}
}
}else
postExperssion.append(experssion.charAt(position));
position++;
if(position >= experssion.length()) break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(operator.top != -1){//取出在堆栈中的所有运算符
operator1 = operator.pop(); postExperssion.append((char)operator1);
} //System.out.println(postExperssion.toString()); ParseExpression.calculateExp(postExperssion.toString());
}

//这个方法属于后续运算方法,就是表达式解析为后序的式子
//如:8/7+(7-2)*4 解析后变成这样 87/72-4*+
/*
* 算法解释:从左至右读取运算单元
* 读取操作数存入堆栈,读取运算符取出操作数进行运算
* 当操作数读完后,即为表达式运算结果
*/
public static void calculateExp(String experssion){
Stack operand = new Stack(20);

int position = 0;
int operand1 = 0;
int operand2 = 0;
int executeResult = 0;

while(true){
if(operand.isOperator(experssion.charAt(position))){
operand1 = operand.pop();
operand2 = operand.pop();

operand.push(operand.result(experssion.charAt(position),
operand1, operand2));
}else
//存入操作数需要做ASCII转换,在这我把其它符号的ASCII
//一并写出来 '[' 91 ']' 93 '{' 123 '}' 125
operand.push(experssion.charAt(position) - 48);
position++;
if(position >= experssion.length())
break;
}

executeResult = operand.pop();
System.out.print("被计算的表示式:" + experssion + " ");
System.out.println("运算结果 = " + executeResult);
}
}

再次感谢楼主加分,如果需要扩展加入‘}’‘]’
这时需要在我的两个类中加入相应条件语句和合理的
if判断OK

因为栈遵循先进后出、后进先出原则,压入或弹出操作均只能在栈顶进行 !

1.栈顶地址是0052h,注:SP始终指向堆栈的栈顶
2.栈底为堆栈的深度,看他最后一个字的偏移地址,所以是0100h
3.ss是堆栈段的段地址,冒号前的地址就是段地址,所以是1250h
4. 压栈后,SP的值是减少的,现在压的是个字,所以SP减2为0050h

///
<summary>
///
用栈判断表达式
///
</summary>
///
<param
name="balance">表达式</param>
///
<returns>true表示是表达式</returns>
public
static
bool
isbalance(string
balance)
{
char[]
chars
=
balance.tochararray();
//如果字符串为空
if
(chars.length
==
0)
{
return
false;
}
stack<char>
s
=new
stack<char>();
for
(int
i
=
0;
i
<
chars.length;i++)
{
switch
(chars[i])
{
case
'(':
s.push(chars[i]);//栈里只存左括号
break;
case
')':
//如果栈里有左括号
if
(s.count
!=
0)
{
s.pop();//去掉记录的一个左括号
}
else
{
return
false;
}
break;
}
}
return
true;
}
这是只判断一种括号的。
你有什么问题吗。不懂可以问


云计算提供服务的几种方式
通常,云计算的服务类型分为三类,即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。这3种云计算服务有时称为云计算堆栈,因为它们构建堆栈,它们位于彼此之上,以下是这三种服务的概述:1、基础设施即服务IaaS)基础设施即服务是主要的服务类别之一,它向云计算提供商的个人或组织提供虚拟化...

计算器AC.C是什么意思?
AC是All Clear 的缩写,功能是清除当前的屏幕显示和内存已有计算堆栈。C是Clear的缩写,功能是清除当前一步的计算数字。其他英文字母的含义:(1)Backspace:退格,删除当前输入数字中的最后一位 (2)CE:清除,清除显示的数字。(3)MC:清除存储器中的数值。(4)MR:将存于存储器中的数显示在...

算术表达式a+b*(c+d\/e )转为后缀表达式是?具体分析下!谢谢!!
转化后的后缀表达式为:abcde\/+*+ 具体分析:1、初始化一空栈,用来对符号进出栈使用。2、第一个字符是a,输出,后面是符号“+”,进栈。输出的为a。3、第三个字符是b,输出,后面是符号“*”,进栈。输出的为ab。4、 第五个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。

PHOTOSHOP智能对象中的堆栈模式有什么作用?它和图层的混合模式有何区别...
堆践模式首先需要是把图层转换成智能对象了,这就意味着可以进行无损调整 图层的混合模式和堆栈都是对图层进行运算,根据算法得到一个新的结果 堆栈模式可以处理大量的图层,算法有最大,最小,平均等,常用来处理需要长曝光的照片进(前期多次曝光,后期用堆栈计算合成),比如星轨的拍摄的后期处理,用...

如何探讨计算思维
计算思维中的抽象完全超越物理的时空观,可以完全用符号来表示,其中,数字抽象只是一类特例。与数学相比,计算思维中的抽象显得更为丰富,也更为复杂。数学抽象 的特点是抛开现实事物的物理、化学和生物等特性,仅保留其量的关系和空间的形式,而计算思维中的抽象却不仅仅如此。堆栈是计算学科中常见的一种...

堆量是什么意思
在计算机科学中,堆栈和堆是两种非常重要的数据结构,它们广泛应用于操作系统、编译器、栈式计算器等领域。堆栈主要用于函数调用和程序执行过程中的临时存储,堆则常用于动态分配内存、垃圾回收和对象存储等方面。堆栈和堆的实现方式各不相同,但它们的作用都是为了更高效地进行程序运行。堆量是指在排队或...

C#模仿微软做的计算器如何实现这几个功能
后面有小点……自己添加就可以了啊,比如截取TextChange事件进行判断在合适的地方加点。一直按等号数字会变:计算器的实现一般都要用到队列和堆栈,按等号结果会变这个属于堆栈的应用。操作数1压栈-》操作符压栈-》操作数2压栈-》出栈计算结果 用堆栈保护用户输入的操作符和操作数,每次按等号就重新进行...

汇编里push入栈的栈顶物理上位于哪里?入栈后栈顶指针为什么应该减一...
在8086汇编里,push入栈的栈顶,物理上的地址由段地址寄存器SS和堆栈指针寄存器SP确定。字节型数据入栈后栈顶指针减一,一方面为下次堆栈操作做准备,另一方面说明堆栈的结构是自底向上的。注意,堆栈指针根据指令操作数自动调整,但不见得一定是加减1....

什么和云计算是21世纪初期互联网发展的两大趋势
人工智能。2019年3月4日,十三届全国人大二次会议举行新闻发布会,大会发言人张业遂表示,已将与人工智能密切相关的立法项目列入立法规划。人工智能始终是计算机科学的前沿学科,计算机编程语言和其它计算机软件都因为有了人工智能的进展而得以存在。云计算具有很强的扩展性和需要性,可以为用户提供一种全新...

如何理解云计算中IaaS,PaaS和SaaS
我们也将说明云计算在什么情况下,不是最好的选择。 云计算层次(Stack)云计算常被描述为一个层次堆栈(Stack),每个层次建立在另一个层次的顶部,并向上提供服务接口,因此被称为“云”。通常,对于云计算的的定义来自于美国国家标准与技术研究院(NIST)。NIST将云计算定义为一个模型,简易的管理即可方便地按需配置网络...

威宁彝族回族苗族自治县15582858485: 关于堆栈的计算! -
释唯牛黄: 1.栈顶地址是0052h,注:SP始终指向堆栈的栈顶 2.栈底为堆栈的深度,看他最后一个字的偏移地址,所以是0100h 3.ss是堆栈段的段地址,冒号前的地址就是段地址,所以是1250h 4. 压栈后,SP的值是减少的,现在压的是个字,所以SP减2为0050h

威宁彝族回族苗族自治县15582858485: 有关堆栈的计算题(ss)=1000H,堆栈指针SP的初始值为003AH,(AA)=2000H执行进栈指令“PUAH AX”之后,(SP)应该是?最好附加原理 -
释唯牛黄:[答案] PUSH AX 指令的过程是先把(AX)的低8位00H放入,再把高8位20H放入,那么这个指令完成后堆栈指针指向的是(AX)的高位,也就是20H

威宁彝族回族苗族自治县15582858485: 单片机堆栈是怎么运算 -
释唯牛黄: 51单片机堆栈是在片内RAM区实现的能先进后出的一个存储区域,由SP寄存器实现数据的入栈和出栈,当有数据入栈时,比如PUSH ACC,此时SP先加一,然后把ACC中的内容存到SP所指向的内存单元中.出栈时,比如POP ACC,此时先把SP所指向的内存单元(栈顶单元)内容送到ACC中,然后SP减一

威宁彝族回族苗族自治县15582858485: 有关堆栈的计算题 -
释唯牛黄: PUSH AX 指令的过程是先把(AX)的低8位00H放入,再把高8位20H放入,那么这个指令完成后堆栈指针指向的是(AX)的高位,也就是20H

威宁彝族回族苗族自治县15582858485: 微机原理堆栈sp字母0 - A等于6是怎么算的? -
释唯牛黄: 16进制的模是16(其实不考虑进位也就是0),0-A 也就是 16-10=6(借位后). ----它就是这么计算的.

威宁彝族回族苗族自治县15582858485: 用堆栈求表达式的值 -
释唯牛黄: 以前学数据结构的时候写的,希望对你有帮助#include<iostream>#include<stack> using namespace std; int operate(int a,int c,int b) { int num; switch(c) { case 0:num=a+b;break; case 1:num=a-b;break; case 2:num=a*b;break; case 3:num=a/b;...

威宁彝族回族苗族自治县15582858485: 写一个返回顺序堆栈S中节点个数的算法 int StackSize(SeqStack) -
释唯牛黄: c++在建栈的时候就可以以一个变量保存堆栈大小. c可以通过遍历计算节点个数.

威宁彝族回族苗族自治县15582858485: 汇编堆栈计算求助 -
释唯牛黄: SS=2010H,SP=FDFEH,bx=1234H,入栈时,SP=SP-2 出栈则SP=SP+2

威宁彝族回族苗族自治县15582858485: 堆栈在计算机里的具体操作 -
释唯牛黄: 堆栈是为了保护数据或是断点地址的 保护数据:比如在中断过后很可能会改写中断前某一个前面正在使用而后面还要用到的寄存器内的数据,一般是人为的入栈出栈 保护断点地址:比如在调用子程序时,断点处的地址会自动入栈,等调用完成时会自动出栈,以接断点处继续向下执行指令很多程序的一开始都会给堆栈指针送一个地址,是为了开辟一段堆栈的空间,首地址就是送入的那个值.当然一般堆栈一开始应该有它默认的空间,但为了避免无意间会占用这一空间,导致程序出错,重新设置一个区域还是很有必要的!你的程序我不是很懂,我说的是堆栈在单片机上的作用和用法,但道理应该都是一样的,希望能够“抛砖引玉”吧!高手见笑!

威宁彝族回族苗族自治县15582858485: 堆栈题目,说明怎么算 -
释唯牛黄: 同意1楼的,ss是段寄存器,保持不变,sp由于存入5个数据,每个数据2个字节,共10字节,sp-10等于0136h.再取出加4为013ah.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网