0

2 つの配列があり、そのうちの 1 つは int を持ち、もう 1 つは演算子の文字を持ちます。[12, 3] と ['+'] という配列があるとします。これを式 12 + 3 に変換したいと思います。これはすぐに評価されます (15 になります)。また、演算の順序も保持する必要があるため、[12, 3, 4] と ['+', '*'] がある場合、12 + 3 * 4 (つまり 24) となるはずです。int の数よりも 1 文字少ないことが保証されているため、常に正しい数の演算子が存在します。Cでこれを行うことは可能ですか?もしそうなら、どのように?

ありがとうございました。

4

3 に答える 3

2

確かにそれは可能です。基本アルゴリズム:

while there are operators left:
  // determine operation
  i = the index of the operator with the highest priority
  operator = operators[i]
  shift operators[i+1..end] one to the left (in other words, remove the operator from the array)
  operation_function = lookup operator

  // execute operation
  numbers[i] = operation_function(numbers[i], numbers[i+1])
  shift numbers[i+2..end] one to the left

それをCに変えて楽しんでください!:)

于 2013-06-11T09:46:42.597 に答える
0

これが解決策です。完全なもの(整数除算など)ではありませんが、アルゴリズムを示しています。

これは非常に単純です。演算子を左から右に削除し、削除するたびに配列を左に 1 つずつシフトするだけです。「*」および「/」は、「+」および「-」よりも優先されます。コードは冗長であり、焼き付けられた入力のみを解決します。それを関数に分割するのはあなたの仕事です。

ここにあります:

#include <stdio.h>

int main()
{
    int nums[8]={1,5,8,2,5,3,4,7};
    int cnums = 8;
    char ops[7]={'+','-','/','*','+','-','*'};
    int cops=7;
    int flag =1;
    int i,j;

    while(flag)
    {
        flag=0;
        for(i=0;i<cnums;i++)
            if(ops[i]=='*' || ops[i]=='/')
            {
                if(ops[i]=='*')
                    nums[i]*=nums[i+1];
                else
                    nums[i]/=nums[i+1];
                flag=1;

                for(j=i;j<cops;j++)
                {
                    ops[j]=ops[j+1];
                    nums[j+1]=nums[j+2];
                }
                cnums--;
                cops--;
                break;
            }
    }

    flag=1;
    while(flag)
    {
        flag=0;
        for(i=0;i<cnums;i++)
            if(ops[i]=='+' || ops[i]=='-')
            {
                if(ops[i]=='+')
                    nums[i]+=nums[i+1];
                else
                    nums[i]-=nums[i+1];
                flag=1;

                for(j=i;j<cops;j++)
                {
                    ops[j]=ops[j+1];
                    nums[j+1]=nums[j+2];
                }
                cnums--;
                cops--;
                break;
            }
    }
    return 0;
}

このLINKで動作することがわかります。

形式言語に精通している場合は、このような問題が発生したときにYACCを試すことをお勧めします。

于 2013-06-11T18:04:42.343 に答える
0
#include<stdio.h>

int calc(char op, int stack[], int *sp){
    switch(op){
    case '+':
        stack[*sp-1] += stack[*sp];
        --(*sp);
        return 1;
    case '-':
        stack[*sp-1] -= stack[*sp];
        --(*sp);
        return 1;
    case '*':
        stack[*sp-1] *= stack[*sp];
        --(*sp);
        return 1;
    case '/':
        stack[*sp-1] /= stack[*sp];
        --(*sp);
        return 1;
    default:
        return 0;
    }
}

int main(void){
    int vals[] = {12, 3, 4}, vali=0, opi;
    char ops[] = {'+', '*', 0}, op_hold = 0;
    int stack[3], sp=-1;
    int result = 0;

    stack[++sp] = vals[vali++];
    for(opi=0;ops[opi];++opi){
        stack[++sp] = vals[vali++];
        if(ops[opi] == '+' || ops[opi] == '-'){
            if(ops[opi+1] == '*' || ops[opi+1] == '/'){
                op_hold = ops[opi];
            } else {
                calc(ops[opi], stack, &sp);
            }
        } else if(ops[opi] == '*' || ops[opi] == '/'){
            calc(ops[opi], stack, &sp);
            if(ops[opi+1] != '*' && ops[opi+1] != '/' && op_hold){
                calc(op_hold, stack, &sp);
                op_hold = 0;
            }
        }
    }
    result = stack[sp--];
    printf("%d\n", result);

    return 0;
}
于 2013-06-11T16:32:45.923 に答える