完成了表达式计算小程序
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