import java.util.Scanner;
import java.lang.*;
import java.lang.String;
import java.lang.Integer;
public class YunSuan{
public static void main(String[] args){
Stack ops = new Stack(); //运算符栈
Stack opds = new Stack(); //操作数栈
String ex = new String (); //用于存储运算式
int zhizhen = 0; //作为ex的下标
int operator = 0; //运算符
int operated1=0,operated2=0; //操作数
Scanner cin = new Scanner(System.in);
System.out.println("请输入运算式");
ex = "#"+cin.nextLine()+"#"; //将输入的运算式存入ex
ops.push((int)ex.charAt(zhizhen++));ops.p++; //将'#'推入ops栈
while(true){
if(ops.isOperator((int)ex.charAt(zhizhen))||(int)ex.charAt(zhizhen)==40||(int)ex.charAt(zhizhen)==41){ //扫描的字符为运算符或'('、')'时
switch ((int)ex.charAt(zhizhen)){
case 40:ops.push(40);ops.p++;break; //字符为“(”
case 41: { if((int)ops.gettop()=40){ //字符为“)”
ops.pop();ops.p--; //弹出ops栈顶元素,栈指针-1
}else if((int)ops.gettop()=41){ //ops栈顶元素为“)”
System.out.println("error"); //出错
}else //ops栈顶元素为运算符
{ operated2 = opds.pop(); //弹出ops和opds的相应元素进行计算
operated1 = opds.pop();
operator = ops.pop();
opds.push((int)opds.twoJieGuo(operated1,operator,operated2));
opds.p--;ops.p--;
}
}
}
if(ops.youxianMa(ops.gettop())>=ops.youxianMa((int)ex.charAt(zhizhen))){ //ops栈顶元素优先级>=扫描字符的优先级
operated2 = opds.pop(); //进行运算
operated1 = opds.pop();
operator = ops.pop();
opds.push((int)opds.twoJieGuo(operated1,operator,operated2));
opds.p--;ops.p--;
}else{ //ops栈顶元素优先级<=扫描字符的优先级
ops.push((int)ex.charAt(zhizhen));ops.p++;
}
}else{
opds.push((int)ex.charAt(zhizhen));opds.p++; //如果扫描所得字符为操作数
}
++zhizhen;
if ((int)ex.charAt(zhizhen) = 35)
break;
}
if((int)ops.gettop()!= 35){ //如果ops中还有运算符
operated2 = opds.pop(); //进行计算
operated1 = opds.pop();
operator = ops.pop();
opds.push((int)opds.twoJieGuo(operated1,operator,operated2));
opds.p--;ops.p--;
}else{
int last = opds.pop();
System.out.print("你输入的表达式:"+ex+"=");
System.out.println(last); //打印运算结果
}
}
}
class Stack{ //定义栈类型
final int max = 20; //栈的最大容量
int[] stackvalue = new Integer(max);
int p = -1; //栈内指针,空栈是为-1
public void push(int num){ //将num变量推入栈
if (this.p == max-1)
System.out.println("栈已满");
else {
this.p++;
this.stackvalue[p] = num;
}
}
public int pop(){ //弹出栈顶元素
if (this.p == -1)
System.out.println("栈已空");
else {
return (this.stackvalue[p]);
this.p--;
}
}
public int gettop(){ //取栈顶元素
if (this.p!=-1)
return (int)this.stackvalue[this.p];
else
System.out.println("栈已空");
}
public boolean isOperator(int num){ //检查变量num是否为运算符
if (num == 42||num == 43||num==45||num==47)
return true;
else
return false;
}
public int twoJieGuo(int a,int operator,int b){ //计算a operator b
switch(operator){
case 42:return (a*b); break;
case 43:return (a+b); break;
case 45:return (a-b); break;
case 47:return (a/b); break;
}
return 0;
}
public int youxianMa(int operator){ //将运算符转换成优先码,用于比较优先级。
switch(operator){
case 42:return 2; break;
case 47:return 2; break;
case 43:return 1; break;
case 45:return 1; break;
}
return 0;
}
}
分享到:
相关推荐
对实验一进行扩展,对识别的无符号数进行计值,并将输出形式改为(类别码,值)的二元式形式。 对实验二进行扩展,计算并输出算术表达式的值。...如果不是无符号数的算术四则运算,输出“非法四则运算表达式”。
利用栈进行算术表达式的运算。以#结束表达式的输入。包括加减乘除括号等字符。
编写一个程序,通过计算机随机产生10道四则运算题,两个操作数为1~10之间的随机数,运算类型根据用户选择而定,如果用户选择1.add,则进行加法运算;如果用户选择2.sub,则进行减法运算;如果用户选择3.mul,则进行...
1.通过修改完善课件案例 3.3 的算法,利用栈来实现算术表达式求值的算法。对算法中调 用的几个函数要给出其实现过程: (1) 函数 In(c):判断 c 是否为运算符; (2) 函数 Precede(t1,t2):判断运算符 t1 和 t2 的...
通过修改完善教材中的算法3.1-3.4,利用栈来实现算术表达式求值的算法。对算法中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; ...
对无符号数的算术四则运算,编制一个语法分析程序。 输入:由实验一输出的单词串,入1, 3, 1。 输出:如果输入单词串是合法的无符号数的算术四则运算,输出“yes”,并且给出每一步的分析过程;如果不是无符号数的...
数据结构利用栈实现算术表达式的求值 C语言版 正号、负号、加、减、乘、除和求模,可包括括号
一个利用栈实现四则运算的小资源,操作数只能是个位数
这是编译原理课上做的一个实验,是关于无符号数四则运算语意处理的代码,代码完整,可以运行
数据结构课程设计,基于栈的四则运算能力测试系统,模块化设计。
用栈实现含+,-,*,/,%,()的算术表达式的计算。
数据结构课程里的题目,利用栈进行算术表达式运算的算法原理
掌握基于栈实现算术表达式求值的原理和算法。 使用VC++语言编写程序,根据数据结构中栈的的逻辑特性和物理存储结构,使用栈实现考虑算符优先的算术表达式求值算法,编译运行程序。
编写一个程序,通过计算机随机产生10道四则运算题,两个操作数为1~10之间的随机数,运算类型根据用户选择而定,如果用户选择1.add,则进行加法运算;如果用户选择2.sub,则进行减法运算;如果用户选择3.mul,则进行...
用栈实现算术表达式的计算,运算符包括+、-、*、/、(、)、=、小数点,类似于编译原理,用来日常计算非常方便。
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示符优先法对算术表达式求值的过程以字符序列的形式从终端输入语法...利用算符优先关系,实现对算术四则运算表达式的求值
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用运算符优先关系,实现对算术四则混合运算表达式的求值。
对学习数据结构,特别是栈与四则混合运算有很大的帮助。本程序是采用VC6.0开发的。
利用运算符优先关系,实现对算术四则混合运算表达式的求值。 【测试数据】 (1)能够判断表达式中的括号是否匹配,测试的表达式中括号不匹配,可以重新输入。 (2)能够处理多位整数以及浮点数。 (3)具体测试数据...
用栈解析算术表达式,并且做到了多位数运算,运算包括加、减、乘、除、求余