频道栏目
首页 > 程序开发 > 软件开发 > C语言 > 正文
C语言中的数据结构——四则运算
2011-08-02 13:58:14           
收藏   我要投稿

 

 

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

实现方法:

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

 1 #include<stdio.h>

 2 #include<string>

 3 #include<conio.h>

 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    evalpost(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 evalpost(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        }

60        else if(f[i]=='/')

61        {

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

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

64             push_sequence_stack(s,x1/x2);

65            i++;

66        }

67    }

68 }

  

      最后,只要调用计算后的结果将存放在操作数栈的第一个位置,并将结果传递给需要显示的地方(可以放到自己的程序中显示结果的地方),显示出结果就没问题了。注意传入要计算的表达式,可用能想到任何方式。好了,就到这里了。

点击复制链接 与好友分享!回本站首页
相关TAG标签 数据结构 语言
上一篇:用宏实现的单例模式
下一篇:C语言实现通用数据类型栈
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站