2020-12-30

问题描述:设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。

(1)输入的形式:表达式,例如2*(3+4)#
包含的运算符只能有’+’ 、’-’ 、’’ 、’/’ 、’(’、 ‘)’,“#”代表输入结束符;
(2)输出的形式:运算结果,例如2
(3+4)=14;
(3)程序所能达到的功能:对表达式求值并输出。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stack_init_size 100
#define stackincrement 10
struct stack
{

    int *base;
    int *top;
    char data;
    int stacksize;
};
void initstack(struct stack &s)
{
    char e;
    s.base =  (int*)malloc(stack_init_size * sizeof(int));
    if(!s.base)
        exit(0);
    s.top = s.base;
    s.stacksize = stack_init_size;
}
char stack_top(struct stack s)
{
    char e;
    if(s.top==s.base)
        return -1;
    e = *(s.top-1);
    return e;
}
void push(struct stack &s,int e)
{
    if(s.top-s.base >= s.stacksize)
    {

        s.base = (int*)realloc(s.base,(s.stacksize + stackincrement) * sizeof(int));
        if(!s.base)
            exit(0);
        s.top = s.base + s.stacksize;
        s.stacksize += stackincrement;
    }
    *s.top++ = e;

}
char pop(struct stack &s)
{
    char e;
    if(s.top==s.base)
        return -1;
    e = *--s.top;
    return e;
}
int getIndex(char theta)   //获取theta所对应的索引
	{
	    int index = 0;
	    switch (theta)
    {
	    case '+':
	        index = 0;
	        break;
	    case '-':
	        index = 1;
	        break;
	    case '*':
	        index = 2;
	        break;
	    case '/':
	        index = 3;
	        break;
	    case '(':
	        index = 4;
	        break;
	    case ')':
	        index = 5;
	        break;
        case '#':
            index = 6;
            default:break;
	    }
	    return index;
	}

	char getPriority(char theta1, char theta2)   //获取theta1与theta2之间的优先级
	{
	    const char priority[][7] =     //算符间的优先级关系
	    {
	        { '>','>','<','<','<','>','>' },
	        { '>','>','<','<','<','>','>' },
	        { '>','>','>','>','<','>','>' },
	        { '>','>','>','>','<','>','>' },
	        { '<','<','<','<','<','=','0' },
	        { '>','>','>','>','0','>','>' },
	        { '<','<','<','<','<','0','=' },
	    };

	    int index1 = getIndex(theta1);
	    int index2 = getIndex(theta2);
	    return priority[index1][index2];
	}
int main(void)
{
    struct stack s1;
    struct stack s2;
    initstack(s1);
    initstack(s2);
    char order[10];
    int i;
    char temp;
    char temp1;
    char temp2;
    printf("input the order,beginning with # and ending with #\n");
    scanf("%s",order);
    for(i=0;i<strlen(order);i++)
    {
        if(order[i]<=57&&order[i]>=48)
            push(s1,order[i]);
        else
        {
            temp = getPriority(order[i],stack_top(s2));
            if(temp=='>')
                push(s2,order[i]);
            else if(temp=='=')
                pop(s2);
            else
            {
                temp1 = (int)stack_top(s1);
                pop(s1);
                temp2 = (int)stack_top(s1);
                pop(s1);
                if(stack_top(s2)=='+')
                    push(s1,temp2 + temp1-48-48);
                else if(stack_top(s2)=='-')
                    push(s1,temp2-temp1);
                else if(stack_top(s2)=='*')
                    push(s1,(temp2-48)*(temp1-48));
                else
                    push(s1,(temp2-48)*1.0/(temp1-48));

            }

        }

    }
    printf("%d\n",stack_top(s1));
    return 0;
}
但是混合运算会出错,大家帮我看看。
### 回答1: 可以使用Python中的pandas库将时间序列数据存储到DataFrame中,然后使用pandas的to_excel()方法将其输出到Excel文件中。 首先,需要使用pandas中的date_range()函数生成时间索引,确定时间范围从2018-01-01 08:00:00到2020-12-30 00:00:00,每小时取一个值。 其次,使用pandas中的DataFrame()函数创建一个新的DataFrame并将时间索引设置为刚才生成的时间索引。 最后,使用DataFrame的to_excel()方法将其输出到Excel文件中。 代码示例如下: ``` python import pandas as pd # 生成时间索引 time_index = pd.date_range('2018-01-01 08:00:00', '2020-12-30 00:00:00', freq='H') # 创建新的DataFrame并将时间索引设置为刚才生成的时间索引 df = pd.DataFrame(index=time_index) # 输出到Excel文件 df.to_excel('output.xlsx') ``` ### 回答2: 首先,我们需要计算从2018年1月1日08:00:00到20201230日00:00:00的总小时数。我们可以使用日期时间函数来完成这个计算。 首先,计算起始日期和结束日期之间的总天数。起始日期是2018年1月1日08:00:00,结束日期是20201230日00:00:00。计算这两个日期之间的天数,可以使用以下公式: =end_date - start_date + 1 其中,"+1"是因为起始日期所占的一天也要计算在内。 接下来,计算总小时数。因为每天有24小时,所以总小时数等于总天数乘以24。公式如下: total_hours = total_days * 24 现在我们知道了从起始日期到结束日期的总小时数,我们可以使用循环来逐小时生成日期时间,并将其写入Excel文件。我们可以使用Python中的openpyxl库来实现这个功能。 首先,导入必要的库: import openpyxl from datetime import datetime, timedelta 然后,创建一个新的Excel工作簿: workbook = openpyxl.Workbook() sheet = workbook.active 接下来,设置起始日期和结束日期: start_date = datetime(2018, 1, 1, 8, 0, 0) end_date = datetime(2020, 12, 30, 0, 0, 0) 然后,用循环生成连续的日期时间,并将其写入Excel文件: current_date = start_date for i in range(total_hours): sheet.cell(row=i+1, column=1).value = current_date current_date += timedelta(hours=1) 最后,保存Excel文件: workbook.save('output.xlsx') 以上就是将2018年1月1日08:00:00到20201230日00:00:00的连续时间每小时取一个值,并输出为Excel文件的步骤。 ### 回答3: 要将2018-01-01 08:00:00到2020-12-30 00:00:00这个时间范围内每小时连续取一个值,并输出到Excel文件中,可以使用Python编程语言中的pandas和openpyxl库来实现。 首先,我们需要导入所需的库: ```python import pandas as pd from openpyxl import Workbook ``` 接下来,我们可以创建一个日期范围,从2018-01-01 08:00:00到2020-12-30 00:00:00,每小时的频率,并将其存储在一个DataFrame中: ```python start_date = pd.Timestamp('2018-01-01 08:00:00') end_date = pd.Timestamp('2020-12-30 00:00:00') date_range = pd.date_range(start=start_date, end=end_date, freq='1H') df = pd.DataFrame(date_range, columns=['Timestamp']) ``` 然后,我们可以向DataFrame中添加其他需要的列,例如年、月、日和小时: ```python df['Year'] = df['Timestamp'].dt.year df['Month'] = df['Timestamp'].dt.month df['Day'] = df['Timestamp'].dt.day df['Hour'] = df['Timestamp'].dt.hour ``` 最后,我们可以使用openpyxl库将DataFrame保存到Excel文件中: ```python output_file = 'output.xlsx' with pd.ExcelWriter(output_file, engine='openpyxl') as writer: df.to_excel(writer, index=False) ``` 完整的代码如下: ```python import pandas as pd from openpyxl import Workbook start_date = pd.Timestamp('2018-01-01 08:00:00') end_date = pd.Timestamp('2020-12-30 00:00:00') date_range = pd.date_range(start=start_date, end=end_date, freq='1H') df = pd.DataFrame(date_range, columns=['Timestamp']) df['Year'] = df['Timestamp'].dt.year df['Month'] = df['Timestamp'].dt.month df['Day'] = df['Timestamp'].dt.day df['Hour'] = df['Timestamp'].dt.hour output_file = 'output.xlsx' with pd.ExcelWriter(output_file, engine='openpyxl') as writer: df.to_excel(writer, index=False) ``` 运行这段代码将生成一个名为output.xlsx的Excel文件,其中包含从2018-01-01 08:00:00到2020-12-30 00:00:00每小时连续取一个值的数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pengpeng1016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值