完成了表达式计算小程序
This commit is contained in:
31
Chapter11/ds/line/compute/Makefile
Normal file
31
Chapter11/ds/line/compute/Makefile
Normal file
@@ -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)
|
||||
149
Chapter11/ds/line/compute/main.c
Normal file
149
Chapter11/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);
|
||||
}
|
||||
72
Chapter11/ds/line/compute/sqstack.c
Normal file
72
Chapter11/ds/line/compute/sqstack.c
Normal file
@@ -0,0 +1,72 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
30
Chapter11/ds/line/compute/sqstack.h
Normal file
30
Chapter11/ds/line/compute/sqstack.h
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user