表达式求值(数据结构书上栈的应用之中的一个)

主要内容:表达式求值。提交nyoj通过。。。

思路:主要就是一个开两个栈,然后一个操作符栈。一个操作数栈。

我的代码例如以下(比較简洁):

/*****
       Author Gery
******/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#define eps 1e-9
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;

const int maxn=1000+10;

stack<double>ly;
stack<char>gery;
char str[maxn],op[maxn];

char operation[7][7]//运算符的优先级
{
    {‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘},//‘+‘
    {‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘},//‘-‘
    {‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘},//‘*‘
    {‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘},//‘/‘
    {‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘=‘,‘,‘},//‘(‘
    {‘>‘,‘>‘,‘>‘,‘>‘,‘,‘,‘>‘,‘>‘},//‘)‘
    {‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘,‘,‘=‘},//‘=‘
};

int get_index(char ch)
{
    switch(ch)
    {
        case ‘+‘:return 0;
        case ‘-‘:return 1;
        case ‘*‘:return 2;
        case ‘/‘:return 3;
        case ‘(‘:return 4;
        case ‘)‘:return 5;
        case ‘=‘:return 6;
    }
}

char get_prio(char a,char b)
{
    int c=get_index(a);
    int d=get_index(b);
    return operation[c][d];
}

double cal_value(double a,double b,char c)
{
    switch(c)
    {
        case ‘+‘:return a+b;
        case ‘-‘:return a-b;
        case ‘*‘:return a*b;
        case ‘/‘:return a*1.0/b;
    }
}

int main()
{
   int t,pd,cnt,i;
   double temp,left_value,right_value,val;
   char ch,Op;
   scanf("%d",&t);
   while(t--)
   {
       scanf("%s",str);
       ly.empty();
       gery.empty();
       gery.push(‘=‘);
       for(i=0;i<strlen(str);i++)
       {
           cnt=0,pd=i;//pd为字符指针
           if(isdigit(str[i])||str[i]==‘.‘||str[i]==‘-‘)//拼数过程
           {
               while(isdigit(str[pd])||str[pd]==‘.‘||str[pd]==‘-‘)
               {
                   op[cnt]=str[pd];
                   cnt++,pd++;
               }
               op[cnt]=‘\0‘;
               temp=atof(op);//系统函数是Ascii to float的缩写。。相似的还有atoi,是把字符串转换成float型的函数
               ly.push(temp);
               i=pd-1;
           }
           else
           {
                ch=get_prio(gery.top(),str[i]);
                switch(ch)
                {
                    case ‘<‘:gery.push(str[i]);break;
                    case ‘=‘:gery.pop();break;
                    case ‘>‘:
                         Op=gery.top(),gery.pop();
                         right_value=ly.top(),ly.pop();
                         left_value=ly.top(),ly.pop();
                         val=cal_value(left_value,right_value,Op);
                         ly.push(val);
                         i--;break;//表达式运算后字符指针要后移
                }
           }
       }
       printf("%.2lf\n",ly.top());
   }
   return 0;
}

/*
2
((-2+3)*1.2+2)=
((-2+3)*10/2)=
*/

后来ac了看了别人用书上的方法进行分装,可是认为太麻烦了。一直不知道究竟哪种方法好。。。

时间: 2024-08-07 04:59:38

表达式求值(数据结构书上栈的应用之中的一个)的相关文章

表达式求值(数据结构书上栈的应用之一)

主要内容:表达式求值,提交nyoj通过... 思路:主要就是一个开两个栈,然后一个操作符栈,一个操作数栈.. 我的代码如下(比较简洁): /***** Author Gery ******/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<vector> #include<cmath&

表达式求值 数据结构

数据结构中栈的应用 1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 char str[1000]; 7 char ans[1000]; 8 struct fu 9 { 10 char ff[1000]; 11 int top; 12 }fse; 13 struct data 14 { 15 int da[1000]; 16 int top; 17 }dse; 18 int you(char

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

C++表达式求值(利用数据结构栈)

唉,刚刚用C++又又一次写了一个较完好的表达式求值程序,最后精简后程序还不到100行.这不经让我 想到了大一上学期刚学c语言时自己费了好大的劲,写了几百行并且功能还不是非常齐全(当时还不能计算有括号的表 达式)的简单计算器程序.刚把两个程序对照了一下.感触还是挺深的,同一时候也再一次体现了数据结构在程序设计 中的重要性. 曾经的那个程序有漏洞并且逻辑复杂,所以就不提了,仅仅说说如今改进后的程序,其思想主要是用到了 栈先进后出的数据结构.在该程序中建有两个栈:一个用于存储运算符,还有一个用于存储操

数据结构 栈的应用 --表达式求值

一: 中缀表达式求值  思想: 需要2个栈,运算对象栈OPND,运算符栈OPTR, 1:将栈OPND初始化为空,栈OPTR初始化为表达式的定界符# 2:扫描表达式,直到遇到结束符# 2.1:当前字符是运算对象,入栈OPND 2.2:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级高,入栈OPTR,处理下一个字符 2.3:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级低,则从栈OPND出栈2个运算对象,从栈OPTR出栈一个运算符进行运算,并将运算结果入栈OPND,处理当前字符 2.4

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

表达式求值_栈

问题 C: 表达式求值 时间限制: 3 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧.比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10).每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每