当前位置:编程学习 > C/C++ >>

C语言中的数据结构——四则运算

 

 

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

实现方法:

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

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,