数据结构——四则运算

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

实现方法:

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 }

  

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

posted @ 2011-07-30 10:38  flute  阅读(1975)  评论(2编辑  收藏  举报