优化了命名
This commit is contained in:
149
C11-数据结构/ds/line/compute/main.c
Normal file
149
C11-数据结构/ds/line/compute/main.c
Normal file
@@ -0,0 +1,149 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "sqstack.h"
|
||||
|
||||
// !!! 课程不完整,程序未写完
|
||||
// TODO: snum和sop需要不同的datatype
|
||||
|
||||
static void compute(sqstack *snum, int *op)
|
||||
{
|
||||
datatype n1, n2, n;
|
||||
|
||||
st_pop(snum, &n2);
|
||||
st_pop(snum, &n1);
|
||||
|
||||
switch (*op)
|
||||
{
|
||||
case '+': n = n1 + n2; break;
|
||||
case '-': n = n1 - n2; break;
|
||||
case '*': n = n1 * n2; break;
|
||||
case '/': n = n1 / n2; break;
|
||||
|
||||
default: exit(1);
|
||||
}
|
||||
st_push(snum, &n);
|
||||
}
|
||||
|
||||
static deal_bracket(sqstack *snum, sqstack *sop)
|
||||
{
|
||||
datatype old_op;
|
||||
|
||||
st_top(sop, &old_op);
|
||||
|
||||
while (old_op != '(')
|
||||
{
|
||||
st_pop(sop, &old_op);
|
||||
compute(snum, &old_op);
|
||||
st_top(sop, &old_op);
|
||||
}
|
||||
|
||||
st_pop(sop, &old_op);
|
||||
}
|
||||
|
||||
static int get_pri(int op)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case '(': return 0;
|
||||
case '+':
|
||||
case '-': return 1;
|
||||
case '*':
|
||||
case '/': return 2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void deal_op(sqstack *snum, sqstack *sop, char op)
|
||||
{
|
||||
datatype old_op;
|
||||
|
||||
if (st_isempty(sop) || op == '(')
|
||||
{
|
||||
st_push(sop, &op);
|
||||
return;
|
||||
}
|
||||
|
||||
st_top(sop, &old_op);
|
||||
|
||||
if (get_pri(op) > get_pri(old_op))
|
||||
{
|
||||
st_push(sop, &op);
|
||||
return;
|
||||
}
|
||||
|
||||
while (get_pri(op) <= get_pri(old_op))
|
||||
{
|
||||
st_pop(sop, &old_op);
|
||||
compute(snum, &old_op);
|
||||
if (st_isempty(sop))
|
||||
break;
|
||||
|
||||
st_top(sop, &old_op);
|
||||
}
|
||||
st_push(sop, &op);
|
||||
}
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
char str[] = "(11+3)*2-5";
|
||||
sqstack *snum, *sop;
|
||||
int value = 0;
|
||||
int flag = 0;
|
||||
int old_op;
|
||||
|
||||
snum = st_create();
|
||||
if (NULL == snum)
|
||||
exit(1);
|
||||
|
||||
sop = st_create();
|
||||
if (NULL == sop)
|
||||
exit(1);
|
||||
|
||||
while (str[i] != '\n')
|
||||
{
|
||||
if (str[i] >= '0' && str[i] <= '9')
|
||||
{
|
||||
value = 10 * value + (str[i] - '0');
|
||||
flag = 1;
|
||||
}
|
||||
else // is a op
|
||||
{
|
||||
if (flag)
|
||||
{
|
||||
st_push(snum, &value);
|
||||
flag = 0;
|
||||
value = 0;
|
||||
}
|
||||
|
||||
if (str[i] == ')')
|
||||
{
|
||||
deal_bracket(snum, sop);
|
||||
}
|
||||
else // ( + - * /
|
||||
{
|
||||
deal_op(snum, sop, str[i]);
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if (flag)
|
||||
st_push(snum, &value);
|
||||
|
||||
while (!st_isempty(sop))
|
||||
{
|
||||
st_pop(sop, &old_op);
|
||||
compute(snum, &old_op);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
st_destroy(snum);
|
||||
st_destroy(sop);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
Reference in New Issue
Block a user