码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-25 18:33:01      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:



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

#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();
 }
}

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

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

标签:

原文地址:http://blog.csdn.net/yueloveme/article/details/47058051

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!