but I've got WA.
What is my problem? Please help me
Code: Select all
#include <stdio.h>
#define MAX 30000
#define EMAX 50
#define MAX_STACK_SIZE 100
#define MAX_EXPR_SIZE 100
typedef struct {
int mine_row;
int mine_col;
char expr[MAX_EXPR_SIZE];
} Eval;
Eval e[MAX];
int excel[1001][20000];
int evaled[1001][20000];
char lines[256];
int data[EMAX];
typedef enum {lparen, rparen, plus, minus, times, divide, mod, eos, operand} precedence;
static int isp[] = {0, 19, 12, 12, 13, 13, 13, 0};
static int icp[] = {20, 19, 12, 12, 13, 13, 13, 0};
int stack[MAX_STACK_SIZE];
char expr[MAX_EXPR_SIZE];
void add(int *top, precedence item);
precedence delete(int *top);
void stack_full();
precedence stack_empty();
precedence get_token(char *r_expr, char *symbol, int *n);
char print_token(precedence token);
char* postfix(char * r_expr);
int eval(char *r_expr);
void add(int *top, precedence item)
{
if(*top >= MAX_STACK_SIZE -1)
{
stack_full();
return;
}
stack[++*top] = item;
}
precedence delete(int *top)
{
if(*top == -1)
return stack_empty();
return stack[(*top)--];
}
void stack_full()
{
}
precedence stack_empty()
{
return operand;
}
precedence get_token(char *r_expr, char *symbol, int *n)
{
int i;
i=0;
symbol[i++] = r_expr[(*n)++];
switch(symbol[0])
{
case '(' : return lparen;
case ')' : return rparen;
case '+' : return plus;
case '-' : return minus;
case '/' : return divide;
case '*' : return times;
case '%' : return mod;
case '\0' : return eos;
default :
while(r_expr[(*n)] != '(' &&r_expr[(*n)] != ')' &&r_expr[(*n)] != '+' &&r_expr[(*n)] != '-' &&
r_expr[(*n)] != '*' &&r_expr[(*n)] != '/' &&r_expr[(*n)] != '%' &&r_expr[(*n)] != '\0')
symbol[i++] = r_expr[(*n)++];
symbol[i] = 0;
return operand;
}
}
char print_token(precedence token)
{
switch( token )
{
case lparen: break;
case rparen: break;
case plus: return '+';
case minus: return '-';
case divide: return '/';
case times: return '*';
case mod: return '%';
case eos: return '\0';
case operand: break;
}
return ' ';
}
char rpostfix[MAX_EXPR_SIZE];
char* postfix(char * r_expr)
{
int rn = 0;
char symbol[10];
precedence token;
int n = 0;
int top = 0;
int length;
int i;
stack[0] = eos;
for(token = get_token(r_expr, symbol, &n); token != eos; token = get_token(r_expr, symbol, &n))
{
if(token == operand) {
length = strlen(symbol);
for(i=0;i<length;i++)
rpostfix[rn++] = symbol[i];
}
else if(token == rparen)
{
while (stack[top] != lparen)
rpostfix[rn++] = print_token(delete(&top));
delete(&top);
}else
{
while(isp[stack[top]] >= icp[token])
rpostfix[rn++] = print_token(delete(&top));
add(&top, token);
}
}
while((token = delete(&top)) != eos)
rpostfix[rn++] = print_token(token);
rpostfix[rn] = '\0';
return rpostfix;
}
int eval(char *r_expr)
{
precedence token;
char symbol;
int op1, op2;
int n = 0;
int top = -1;
token = get_token(r_expr, &symbol, &n);
while(token != eos)
{
if(token == operand)
add(&top, symbol - '0');
else
{
op2 = delete(&top);
op1 = delete(&top);
switch(token)
{
case plus: add(&top, op1 + op2); break;
case minus: add(&top, op1 - op2); break;
case times: add(&top, op1 * op2); break;
case divide: add(&top, op1 / op2); break;
case mod: add(&top, op1 % op2); break;
}
}
token = get_token(r_expr, &symbol, &n);
}
return delete(&top);
}
char calcexpr[MAX_EXPR_SIZE];
int resss;
int GetData(int pos) {
int t_col, t_row;
int length;
int flag;
int k, i;
int wpos;
int t_length;
precedence token;
char symbol;
int op1, op2;
int n = 0;
int top = -1;
length = strlen(e[pos].expr);
wpos = 0;
for(k=0;k<length;) {
t_col = t_row = 0;
while(e[pos].expr[k] >= 'A' && e[pos].expr[k] <= 'Z') {
t_col=t_col*26+e[pos].expr[k]-'A'+1;
k++;
}
while(e[pos].expr[k] >= '0' && e[pos].expr[k] <= '9') {
t_row=t_row*10+e[pos].expr[k]-'0';
k++;
}
if(!evaled[t_row][t_col]) return 0;
add(&top, excel[t_row][t_col]);
while(e[pos].expr[k] == '*' || e[pos].expr[k] == '/' || e[pos].expr[k] == '+' || e[pos].expr[k] == '-') {
op2 = delete(&top);
op1 = delete(&top);
switch(e[pos].expr[k++])
{
case '+': add(&top, op1 + op2); break;
case '-': add(&top, op1 - op2); break;
case '*': add(&top, op1 * op2); break;
case '/': add(&top, op1 / op2); break;
}
}
}
resss=delete(&top);
return 1;
}
int main ()
{
int rep;
int row, col;
int i, j, k;
int length;
int d_length;
int data_pos;
int eval_count;
int flag;
int count;
scanf("%d", &rep);
while(rep--) {
scanf("%d %d", &row, &col);
eval_count = 0;
for(i=0;i<=row;i++)
for(j=0;j<=col;j++) evaled[i][j] = 0;
for(i=1;i<=row;i++) {
for(j=1;j<=col;j++) {
scanf("%s", lines);
if(lines[0] != 'e') {
excel[i][j] = atoi(lines);
evaled[i][j] = 1;
}
else {
length = strlen(lines);
e[eval_count].mine_row = i;
e[eval_count].mine_col = j;
strcpy(e[eval_count++].expr, postfix(&lines[1]));
}
}
}
i=0;
count = 0;
while(eval_count != count) {
flag = 1;
if(evaled[e[i].mine_row][e[i].mine_col])
flag = 0;
if(GetData(i)) {
evaled[e[i].mine_row][e[i].mine_col] = 1;
excel[e[i].mine_row][e[i].mine_col] = resss;
count++;
}
i=(i+1)%eval_count;
}
for(i=1;i<=row;i++) {
printf("%d", excel[i][1]);
for(j=2;j<=col;j++) {
printf(" %d", excel[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}