滴滴笔试——算式转移

题目:给出一个仅包含加减乘除四种运算符的算式(不含括号),如1+2*3/4,在保持运算符顺序不变的情况下,现在你可以进行若干次如下操作:如果交换相邻的两个数,表达式值不变,那么你就可以交换这两个数。

#include <vector>
#include <iostream>
using namespace std;
int n;
void QuickSort(vector<int>& nums, int left, int right){
    if(left >= right) return;
    int pivot = nums[left], l = left, r = right;
    while(l < r){
        while(l < r && nums[r] > pivot) --r;
        while(l < r && nums[l] <= pivot) ++l;
        swap(nums[l], nums[r]);
    }
    swap(nums[left], nums[r]);
    QuickSort(nums, left, r-1);
    QuickSort(nums, r+1, right);
}
int main(){
    cin >> n;
    vector<int> nums(n, 0);
    vector<char> ops(n, '+');
    for(int i=0; i<n-1; ++i){
        cin >> nums[i];
        cin >> ops[i+1];
    }
    cin >> nums[n-1];
    int l = 0, r = 0;
    while(r < n){
        while(r < n && ops[r] == ops[l]) ++r;
        if(ops[l] == '+' || ops[l] == '-'){
            if(r < n && (ops[r] == '*' || ops[r] == '/')) QuickSort(nums, l, r-2);//为什么要r-2,因为数字总是在运算符的左侧,运算符比数字少一个
            else QuickSort(nums, l, r-1);
        }else if(ops[l] == '*'){
            if(l > 0 && (ops[l-1] == '+' || ops[l-1] == '-')) QuickSort(nums, l-1, r-1);
            else QuickSort(nums, l, r-1);
        }else if(ops[l] == '/'){
            QuickSort(nums, l, r-1);
        }
        l = r;
    }
    cout << nums[0];
    for(int i=1; i<n; ++i) cout << ' ' << ops[i] << ' ' << nums[i];
    return 0;
}
#include #include struct four { double a; struct four *next; //定义结构体,作为链表的节点. }; void main() { double sum(void); //函数声明. 该函数返回等式的计算结果. 有优先级的运算符号在函数内部先进行计算。 double sum1; printf("请输入等式,以 '=' 结束, 例如“ 2*2*3-2/2= ” 结果将自动保留六位有效数字\n"); sum1=sum(); printf("该等式的结果为:\t%f\n\n",sum1); } double sum(void) { struct four *head,*pnew,*ptail,*p,*q; //结构体成员. char ah; double s=0,last; //last作为 pnew->a 的前一个数值. int j=1; q=(struct four *)malloc(sizeof(struct four)); scanf("%lf%c",&q->a,&ah); last=q->a; while(j==1 && ah!='=') //头节点的建立. { switch(ah) //对运算符号的优先级进行选择,优先级高的先进行计算. { case '+': j=0; continue; break; case '-': j=0; continue; break; case '*': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last*q->a; break; case '/': q=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&q->a); q->a=last/q->a; break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } last=q->a; scanf("%c",&ah); } pnew=(struct four *)malloc(sizeof(struct four)); pnew->a=q->a; //将头节点的信息传递给 head 和 ptail. head=ptail=pnew; while(ah!='=') //接下来节点的建立. { pnew=(struct four *)malloc(sizeof(struct four)); scanf("%lf",&pnew->a); switch(ah) { case '*': pnew->a=last*pnew->a; break; case '/': pnew->a=last/pnew->a; break; case '+': break; case '-': pnew->a=-pnew->a;break; default: printf("Error!\n"); //当运算符号出错时的处理. exit(0); } scanf("%c",&ah); if(ah=='-' || ah=='+'|| ah=='=') //将值进行传递 ptail->next=pnew. { ptail->next=pnew; ptail=pnew; } last=pnew->a; } ptail->next=NULL; p=head; while(p!=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

STRUGGLE_xlf

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

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

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

打赏作者

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

抵扣说明:

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

余额充值