设为首页 加入收藏

TOP

C语言中的数据结构――四则运算 (一)
2014-11-23 22:53:50 来源: 作者: 【 】 浏览:4
Tags:言中 数据结构 四则 运算

要进行一个表达式的计算,一个关键的就是括号匹配问题,现在使用栈进行实现计算表达式的值,可以作为实现一个简单四则运算计算器核心部分。根据栈的特性(先进后出),所以决定通过把输入的表达式转换为后缀表达式,通过后缀表达式进行计算。

实现方法:

1.首先定义两个栈,一个用于存放操作符,一个用于存放操作数。

1 #include

2 #include

3 #include

4 #define MAXSIZE 100

5 typedef float datatype;

6

7 typedef struct

8 {

9 datatype a[MAXSIZE];

10 int top;

11 }sequence_stack;

12

13 typedef struct

14 {

15 char b[MAXSIZE];

16 int top;

17 }SeqStack;

  

2.需要两个数组,一个用于存放输入的中缀表达式,一个用于存放将中缀表达式转换后的后缀表达式。

将中缀表达式转换为后缀表达式的主要代码:

1 int operation(char op)//判断是否为操作符

2 {

3 switch(op)

4 {

5 case'+':

6 case'-':

7 case'*':

8 case'/':return 1;

9 default:return 0;

10 }

11 }

12 int priority(char op)//判断操作符的优先级

13 {

14 switch(op)

15 {

16 case'#':return -1;

17 case'(':return 0;

18 case'+':

19 case'-':return 1;

20 case'*':

21 case'/':return 2;

22 default: return -1;

23 }

24 }

25 //将中缀表达式转换为后缀表达式

26 void postfix(char e[],char f[],SeqStack *s,sequence_stack *s1)

27 {

28 int i=0,j=0;

29 int t;

30 push_SeqStack(s,'#');

31 while(e[i]!='#')

32 {

33 if((e[i]>='0'&&e[i]<='9')||e[i]=='.')

34 f[j++]=e[i];

35 else if(e[i]=='(')

36 {

37 push_SeqStack(s,e[i]);

38 }

39 else if(e[i]==')')

40 {

41 t=s->top-1;

42 while(s->b[t]!='(')

43 {

44 f[j++]=s->b[--s->top];

45 t=s->top-1;

46 }

47 s->top--;

48 }

49 else if(operation(e[i]))

50 {

51 f[j++]=' ';

52 while(priority(s->b[s->top-1])>=priority(e[i]))

53 f[j++]=s->b[--s->top];

54 push_SeqStack(s,e[i]);

55 }

56 i++;

57 }

58 while (s->top)f[j++]=s->b[--s->top];

59 {}

60 eva lpost(f,s1);

61 }

3.把存放后缀表达式的数组传递给计算后表达式的函数;

计算后缀表达式的值主要代码:

1 float readnumber(char f[],int *i)//将数字字符串转变为数

2 {

3 float x=0.0;

4 int k=0;

5 while(f[*i]>='0'&&f[*i]<='9')

6 {

7 x=x*10+(f[*i]-'0');

8 (*i)++;

9 }

10 if(f[*i]=='.')

11 {

12 (*i)++;

13 while(f[*i]>='0'&&f[*i]<='9')

14 {

15 x=x*10+(f[*i]-'0');

16 (*i)++;

17 k++;

18 }

19 }

20 while(k!=0)

21 {

22 x=x/10.0;

23 k=k-1;

24 }

25 return (x);

26 }

27 void eva lpost(char f[],sequence_stack *s)

28 {

29 int i=0;

30 float x1,x2;

31 while(f[i]!='#')

32 {

33 if(f[i]>='0'&&f[i]<='9')

34 {

35 push_sequence_stack(s,readnumber(f,&i));

36 }

37 else if(f[i]==' ')

38 i++;

39 else if(f[i]=='+')

40 {

41 x2=s->a[--s->top];

42 x1=s->a[--s->top];

43 push_sequence_stack(s,x1+x2);

44 i++;

45 }

46 else if(f[i]=='-')

47 {

48 x2=s->a[--s->top];

49 x1=s->a[--s->top];

50 push_sequence_stack(s,x1-x2);

51 i++;

52 }

53 else if(f[i]=='*')

54 {

55 x2=s->a[--s->top];

56 x1=s->a[--s->top];

57 push_sequence_stack(s,x1*x2);

58 i++;

59

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇float有效位数 下一篇C语言实现通用数据类型栈

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: