diff --git a/Chapter11/ds/line/compute/Makefile b/Chapter11/ds/line/compute/Makefile new file mode 100644 index 0000000..a7681ed --- /dev/null +++ b/Chapter11/ds/line/compute/Makefile @@ -0,0 +1,31 @@ +# 方便起见一般都会先定义编译器链接器 +CC = gcc +LD = gcc + +# 正则表达式表示目录下所有.c文件,相当于:SRCS = main.c a.c b.c +SRCS = $(wildcard *.c) + +# OBJS表示SRCS中把列表中的.c全部替换为.o,相当于:OBJS = main.o a.o b.o +OBJS = $(patsubst %c, %o, $(SRCS)) + +# 可执行文件的名字 +TARGET = main + +# .PHONE伪目标,具体含义百度一下一大堆介绍 +.PHONY:all clean + +# 要生成的目标文件 +all: $(TARGET) + +# 第一行依赖关系:冒号后面为依赖的文件,相当于Hello: main.o a.o b.o +# 第二行规则:$@表示目标文件,$^表示所有依赖文件,$<表示第一个依赖文件 +$(TARGET): $(OBJS) + $(LD) -o $@ $^ + +# 上一句目标文件依赖一大堆.o文件,这句表示所有.o都由相应名字的.c文件自动生成 +%.o:%.c + $(CC) -c $^ + +# make clean删除所有.o和目标文件 +clean: + rm -f $(OBJS) $(TARGET) diff --git a/Chapter11/ds/line/compute/main.c b/Chapter11/ds/line/compute/main.c new file mode 100644 index 0000000..1e8aa6b --- /dev/null +++ b/Chapter11/ds/line/compute/main.c @@ -0,0 +1,149 @@ +#include +#include + +#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); +} \ No newline at end of file diff --git a/Chapter11/ds/line/compute/sqstack.c b/Chapter11/ds/line/compute/sqstack.c new file mode 100644 index 0000000..d10927d --- /dev/null +++ b/Chapter11/ds/line/compute/sqstack.c @@ -0,0 +1,72 @@ +#include +#include + +#include "sqstack.h" + +sqstack *st_create(void) +{ + sqstack *st; + + st = malloc(sizeof(*st)); + if (NULL == st) + return NULL; + + st->top = -1; + + return st; +} + +int st_isempty(sqstack *st) +{ + return (-1 == st->top); +} + +int st_push(sqstack *st, datatype *data) +{ + if (MAXSIZE - 1 == st->top) + return -1; + + st->data[++st->top] = *data; + + return 0; +} + +/* 取出栈顶元素 */ +int st_pop(sqstack *st, datatype *data) +{ + if (st_isempty(st)) + return -1; + + *data = st->data[st->top--]; + + return 0; +} + + +/* 查看栈顶元素 */ +int st_top(sqstack *st, datatype *data) +{ + if (st_isempty(st)) + return -1; + + *data = st->data[st->top]; + + return 0; +} + +void st_travel(sqstack *st) +{ + if (st_isempty(st)) + return; + + int i; + + for (i = 0; i <= st->top; i++) + printf("%d ", st->data[i]); + printf("\n"); +} + +void st_destroy(sqstack *st) +{ + free(st); +} diff --git a/Chapter11/ds/line/compute/sqstack.h b/Chapter11/ds/line/compute/sqstack.h new file mode 100644 index 0000000..abaf63a --- /dev/null +++ b/Chapter11/ds/line/compute/sqstack.h @@ -0,0 +1,30 @@ +#ifndef SQSTACK_H__ +#define SQSTACK_H__ + +#define MAXSIZE 32 + +typedef int datatype; + +typedef struct node_st +{ + datatype data[MAXSIZE]; + int top; +} sqstack; + +sqstack *st_create(void); + +int st_isempty(sqstack *); + +int st_push(sqstack *, datatype *); + +/* 取出栈顶元素 */ +int st_pop(sqstack *, datatype *); + +/* 查看栈顶元素 */ +int st_top(sqstack *, datatype *); + +void st_travel(sqstack *); + +void st_destroy(sqstack *); + +#endif \ No newline at end of file