nyoj 表达式求值--栈的应用

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35

思路:用栈模拟数的四则运算;初始化各种运算符之间的优先级;

代码如下:

#include "stdio.h"
#include "string.h"
#include "stack"
using namespace std;

#define N 2005

char str[N];
int OPS[256];
char table[8][8]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<=<",">>>>>>>","<<<<<<="};
//上面语句定义了操作符之间的优先级,从0~6依次为+-*/()=七种运算符

double Calculate(char ch,double x1,double x2)  
{
    if(ch=='+')
        return x1+x2;
    else if(ch=='-')
        return x1-x2;
    else if(ch=='*')
        return x1*x2;
    else if(ch=='/')
        return x1/x2;
}

int main()
{
    int T;
    int i,j;
    int len;
    memset(OPS,-1,sizeof(OPS));
    OPS['+'] = 0;
    OPS['-'] = 1;
    OPS['*'] = 2;
    OPS['/'] = 3;
    OPS['('] = 4;
    OPS[')'] = 5;
    OPS['='] = 6;
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        scanf("%s",str+1);
        str[0] = '=';
        stack<double> q;  //操作数栈
        stack<char> t;  //操作符栈
        len = strlen(str);
        for(i=0; i<len; )
        {
            if(OPS[str[i]]==-1)  //若当前字符不为运算符,将这个数字读下来加入操作数栈(double类型)
            {
                int wei=1;
                bool flag = true;
                double temp=0;
                for(j=i; OPS[str[j]]==-1; ++j)
                {
                    if(str[j]=='.'){ flag = false; continue; }
                    temp = temp*10+str[j]-'0';
                    if(!flag) wei*=10;
                }
                temp = temp/wei;
                i = j;
                q.push(temp);
            }
            else
            {
                if(t.empty())  //若操作符栈为空,直接将下一个操作符加入操作符队列
                    t.push(str[i++]);
                else
                {
                    char ch1 = t.top();
                    char ch2 = str[i];
                    if(table[OPS[ch1]][OPS[ch2]]=='>')  //前一个操作符先执行,则先执行前一个操作符,再加入这个操作符
                    {
                        double x2 = q.top(); 
                        q.pop();
                        double x1 = q.top(); 
                        q.pop();
                        char ch = t.top(); 
                        t.pop();
                        double x = Calculate(ch,x1,x2); //运算这两个数
                        q.push(x);
                    }
                    else if(table[OPS[ch1]][OPS[ch2]]=='<')  //前一个操作符后执行,则直接将当期这个操作如入栈
                        t.push(str[i++]);
                    else if(table[OPS[ch1]][OPS[ch2]]=='=') //'='的情况表示括号对,后者等号对,将这两个操作符都消去。
                        t.pop(), i++;
                }
            }
        }
        printf("%.2lf\n",q.top());
        q.pop();
    }
    return 0;
}



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
孪生素数是指两个素数之间的差值为2的素数对。通过筛选法可以找出给定素数范围内的所有孪生素数的组数。 在引用的代码中,使用了递归筛选法来解决孪生素数问题。该程序首先使用循环将素数的倍数标记为非素数,然后再遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 具体实现过程如下: 1. 定义一个数组a[N,用来标记数字是否为素数,其中N为素数范围的上限。 2. 初始化数组a,将0和1标记为非素数。 3. 输入要查询的孪生素数的个数n。 4. 循环n次,每次读入一个要查询的素数范围num。 5. 使用两层循环,外层循环从2遍历到num/2,内层循环从i的平方开始,将素数的倍数标记为非素数。 6. 再次循环遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 7. 输出总数。 至此,我们可以使用这个筛选法的程序来解决孪生素数问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python用递归筛选法求N以内的孪生质数(孪生素数)](https://blog.csdn.net/weixin_39734646/article/details/110990629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NYOJ-26 孪生素数问题](https://blog.csdn.net/memoryofyck/article/details/52059096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值