데이터 구조 - 사 칙 연산

37070 단어 데이터 구조
표현 식 계산 을 하려 면 괄호 일치 문제 가 관건 입 니 다. 현재 스 택 을 사용 하여 표현 식 의 값 을 계산 하고 간단 한 네 가지 연산 계산기 의 핵심 부분 으로 할 수 있 습 니 다.스 택 의 특성 (선진 후 출) 에 따라 입력 한 표현 식 을 접미사 표현 식 으로 바 꾸 고 접미사 표현 식 으로 계산 하기 로 했 습 니 다.
실현 방법:
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 }

  
      마지막 으로 계 산 된 결 과 를 호출 하면 작업 스 택 의 첫 번 째 위치 에 저장 하고 결 과 를 표시 할 곳 (자신의 프로그램 에 결 과 를 표시 할 수 있 는 곳) 에 전달 하면 결 과 를 표시 하 는 데 문제 가 없다.계산 할 표현 식 을 입력 하 십시오. 어떤 방식 으로 든 생각 할 수 있 습 니 다.자, 여기까지 입 니 다.

좋은 웹페이지 즐겨찾기