南阳 oj 表达式求值 题目35 数据结构 NYOj



建议不会的看别人的代码自己在之上模拟一遍,只要耐心模拟就会做出来

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 1000

using namespace std;

char s[N];//存储字符串

char str1[N];//存储‘o‘-到‘9‘的字符

char str2[N];//存储运算符

int top1,top2;//利用数组模拟栈

int compare(char x)//优先级比较

{

switch(x)

{

case ‘+‘ :

case ‘-‘ :return 1;

case ‘*‘ :

case ‘/‘ :return 2;

case ‘(‘ :return 0;

default: return -1;

}

}

void zhuan()//转换

{

int k;

top1=-1,top2=-1;//初始化头

scanf("%s",s);

k=strlen(s);

for(int i=0;i<k;i++)

{

if(s[i]>=‘0‘&&s[i]<=‘9‘||s[i]==‘.‘)//如果是数字进去str1数组中

{

top1++;

str1[top1]=s[i];

}

else if(s[i]==‘(‘)//如果是‘(‘进入str2中

{

top2++;

str2[top2]=s[i];

}

else if(s[i]==‘)‘)//如果是‘)‘说明str2中有运算符

{

while(str2[top2]!=‘(‘)

{

top1++;

str1[top1]=‘ ‘;

top1++;

str1[top1]=str2[top2];

top2--;

}

top2--;//把‘(‘出去

}

else if(s[i]==‘+‘||s[i]==‘-‘||s[i]==‘*‘||s[i]==‘/‘)//如果是运算符比较优先级

{

top1++;

str1[top1]=‘ ‘;

while(compare(s[i])<=compare(str2[top2]))//如果s[i]优先级低于之前也就是str2中的运算符  把str2中的运算符给str1

{

top1++;

str1[top1]=str2[top2];

top1++;

str1[top1]=‘ ‘;

top2--;

}

top2++;

str2[top2]=s[i];//如果str2高进入str2

}

}

while(top2!=-1)//将剩余的进入str1中

{

top1++;

str1[top1]=‘ ‘;

top1++;

str1[top1]=str2[top2];

top2--;

}

top1++;

str1[top1]=‘ ‘;

top1++;

str1[top1]=‘=‘;

top1++;

str1[top1]=‘\0‘;

}

void sum()//计算

{

double a1,a2,d[N];

char ch;

char s1[100],st[N];

int k,t=-1;

for(int i=0;i<top1;i++)

{

k=0;

ch=str1[i];

while(str1[i]!=‘ ‘)

{

if(str1[i]==‘=‘) break;

s1[k++]=str1[i];

i++;

}

if(ch>=‘0‘&&ch<=‘9‘)

{

s1[k]=‘\0‘;

t++;

d[t]=atof(s1);

}

else

{

switch(ch)

{

case ‘+‘ :

a2=d[t];

t--;

a1=d[t];

t--;

t++;

d[t]=a1+a2;

break;

case ‘-‘ :

a2=d[t];

t--;

a1=d[t];

t--;

t++;

d[t]=a1-a2;

break;

case ‘*‘ :

a2=d[t];

t--;

a1=d[t];

t--;

t++;

d[t]=a1*a2;

break;

case ‘/‘ :

a2=d[t];

t--;

a1=d[t];

t--;

t++;

d[t]=a1/a2;

break;

default : break;

}

}

}

printf("%.2lf\n",d[t]);

}

main()

{

int n;

scanf("%d",&n);

while(n--)

{

zhuan();

sum();

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 13:30:24

南阳 oj 表达式求值 题目35 数据结构 NYOj的相关文章

南阳 oj 表达式求值 题目35 数据结构 NYO题目链接

?? 建议不会的看别人的代码自己在之上模拟一遍,仅仅要耐心模拟就会做出来 题目链接:http://acm.nyist.net/JudgeOnline/problem.php? pid=35 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 using namespace std; char s[N];//存储字符串 char str1[N];//存储'o'-到'9'的字符 cha

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

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

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

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

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

数据结构 表达式求值

实现表达式求值,以及表达式中括号是否匹配. 实现方法,建立两个栈,一个用来存放操作数,一个用来存放运算符.判断运算符优先级来确定什么时候出栈,利用一个数组去表示优先级 头文件代码如下: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <iostream> #include <string.h> using namespace std; template<class Type> class Stack

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

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

C++与数据结构 -- stack实现表达式求值[注释版]

有好多朋友评论以前的那篇博文说:代码中间没有注释.由于课程一直比较紧张,所以答应的注释直到今天才写, 发表出来,与大家共享! #include <map> #include <stack> #include <string> #include <iostream> #include <fstream> using namespace std; //为+,-,*,/运算符 设定优先级 map<char,int> priority; vo

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

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

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

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