私はRPN計算機を扱っていますが、式やステートメントがないswitch
場所を使用しているいくつかのアプローチを見つけました:case
break
残念ながら、このアルゴリズムを使用している私のアプローチは次のとおりです。関数の入力として、次のようにstruct
定義の配列を使用しています。
num OPERATORS {val, PLUS, MINUS, MULTI, DIV, SIN, COS, O_PAREN, C_PAREN, END};
typedef struct value {
double number;
enum OPERATORS oper;
};
RPN パーサーは次のとおりです。
void get_the_rpn(struct value values[], struct value rpn_values[], int length) {
struct value stack[256]; //stack for keeping the values
int i; //iterator
int pos; //postion on stack
i=pos=0;
//go trough each element in values and reprase it to the rpn format
while(values[i].oper != END) {
//check first if current element isn't number
if(values[i].oper == val) {
rpn_values[i] = values[i];
pos++;
}
//current element isn't number is an operator
else
switch(values[i].oper)
{
case PLUS:
;
case DIV:
while (pos && stack[pos-1].oper != O_PAREN &&
stack[pos-1].oper != PLUS &&
stack[pos-1].oper != MINUS) {
rpn_values[i] = stack[--pos];
}
stack[pos++] = values[i];
break;
case MINUS:
while (pos && stack[pos-1].oper != O_PAREN) {
rpn_values[i] = stack[--pos];
}
stack[pos++] = values[i];
break;
case MULTI:
;
case O_PAREN:
stack[pos++] = values[i];
break;
case C_PAREN:
while (stack[pos-1].oper != O_PAREN) {
rpn_values[i] = stack[--pos];
}
pos--;
break;
case SIN:
rpn_values[i] = values[i];
break; //edited
case COS:
rpn_values[i] = values[i];
break; //edited
}
i++;
}
}
問題は主にPLUS
、なぜ for句に単にステートメントがないのかということです。MULTI
case
;
誰かがコード全体を見たいと思っていて、バグを見つけた可能性がある場合は、calculate.c
プログラム全体http://pastebin.com/WteqbmJgをご覧ください。