题目:求4+4/2-9*3的值;
思路:
①:用一个字符型数组存放了表达式《4+4/2-9*3》;
1 char val[9] = {'4','+','4','/','2','-','9','*','3'};
②:定义两个栈,一个存放数字,一个存放符号;
1 //定义存储整型的栈 2 typedef struct node 3 { 4 int data[MAXSIZE]; 5 int top; 6 }SeqStack; 7 //定义存储字符型的栈 8 typedef struct nodeb 9 { 10 char data[MAXSIZE]; 11 int top; 12 }SeqStackchar;
③:定义符号的优先级;
1 //获取优先级 2 int youxianquan(char c) 3 { 4 int x; 5 switch(c) 6 { 7 case '-': 8 case '+': 9 x = 1; 10 break; 11 case '*': 12 case '/': 13 x = 2; 14 break; 15 default: printf("error"); 16 } 17 return(x); 18 }
④:确定运算思路——自左扫描表达式的每一个字符时,若当前字符是运算数值,入整型栈。是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低,则从对象栈出栈两个运算量,从运算符栈出栈一个运算符进行运算,将其运算结果入对象栈。然后继续判断当前字符串是否高于栈顶运算符,如果比栈顶运算符高,则入栈,否则则继续运算。
1 //表达式求值 2 int result(SeqStack *a, SeqStackchar *b) 3 { 4 char val[9] = {'4','+','4','/','2','-','9','*','3'}; //创建表达式 5 int i,resultval; 6 int x,y; 7 char c; 8 int n = sizeof(val); 9 for(i = 0; i < n; i++) 10 { 11 c = val[i]; //获取表达式第i个值 12 if(i%2 == 0) //把数字和符号区分开来, 13 { 14 a->top++; 15 a->data[a->top] = c - '0'; //存放数值的 16 } 17 else //存放符号的 18 { 19 if(b->top == -1) //如果b为空则直接存入符号 20 { 21 b->top++; 22 b->data[b->top] = c; 23 } 24 else 25 { 26 x = youxianquan(c); //求出当前符号的优先级 27 y = youxianquan(b->data[b->top]); //求b栈顶的符号优先级 28 if(x > y) //如果当前优先级大于栈顶优先级,则进栈 29 { 30 b->top++; 31 b->data[b->top] = c; 32 } 33 else 34 { 35 resultval = abyunsuan(a,b); //否则a的前两个出栈,b的栈顶出栈,然后进行运算,运算结果再进栈a; 36 y = youxianquan(b->data[b->top]); //继续判断表达式第i个值的优先级是否大于栈顶符号的优先级 37 if(x > y) //如果当前优先级大于栈顶优先级,则进栈 38 { 39 b->top++; 40 b->data[b->top] = c; 41 } 42 else //否则重复上面的操作对a的前两个出栈值和b的栈顶出栈并且运算 43 { 44 resultval = abyunsuan(a,b); 45 //由于每次循环都会对b的栈顶符号的优先级做对比,所以优先级的对比只做一次即可 46 b->top++; //把当前的符号进b栈 47 b->data[b->top] = c; 48 } 49 } 50 } 51 } 52 while(i == n - 1 && a->top != -1 && b->top != -1) //当运算符输入完时 53 { 54 resultval = abyunsuan(a,b); 55 } 56 } 57 return resultval; 58 }
1 //a出栈两个值 b出栈栈顶运算符,进行运算 2 int abyunsuan(SeqStack *a, SeqStackchar *b) 3 { 4 int fir,sec,resultval; 5 char topchar; 6 fir = a->data[a->top]; 7 a->top--; 8 sec = a->data[a->top]; 9 a->top--; 10 topchar = b->data[b->top]; //b的栈顶出栈 11 b->top--; 12 resultval = yunsuan(sec,fir,topchar); 13 a->top++; 14 a->data[a->top] = resultval; 15 return(resultval); 16 }
全部代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define MAXSIZE 1024 6 7 //定义存储整型的栈 8 typedef struct node 9 { 10 int data[MAXSIZE]; 11 int top; 12 }SeqStack; 13 //定义存储字符型的栈 14 typedef struct nodeb 15 { 16 char data[MAXSIZE]; 17 int top; 18 }SeqStackchar; 19 20 //创建整型栈 21 SeqStack *creat_sa() 22 { 23 SeqStack *s; 24 s = (SeqStack *)malloc(sizeof(SeqStack)); 25 s->top = -1; 26 return(s); 27 } 28 //创建字符串栈 29 SeqStackchar *creat_sb() 30 { 31 SeqStackchar *s; 32 s = (SeqStackchar *)malloc(sizeof(SeqStackchar)); 33 s->top = -1; 34 return(s); 35 } 36 37 //函数声明 38 int youxianquan(char c); 39 int yunsuan(int a, int b, char c); 40 int result(SeqStack *a, SeqStackchar *b); 41 int abyunsuan(SeqStack *a, SeqStackchar *b); 42 43 //获取优先级 44 int youxianquan(char c) 45 { 46 int x; 47 switch(c) 48 { 49 case '-': 50 case '+': 51 x = 1; 52 break; 53 case '*': 54 case '/': 55 x = 2; 56 break; 57 default: printf("error"); 58 } 59 return(x); 60 } 61 62 //开始运算 63 int yunsuan(int a, int b, char c) 64 { 65 int result; 66 switch(c) 67 { 68 case '*': 69 result = a * b; 70 break; 71 case '/': 72 result = a / b; 73 break; 74 case '+': 75 result = a + b; 76 break; 77 case '-': 78 result = a - b; 79 break; 80 } 81 return(result); 82 } 83 84 //a出栈两个值 b出栈栈顶运算符,进行运算 85 int abyunsuan(SeqStack *a, SeqStackchar *b) 86 { 87 int fir,sec,resultval; 88 char topchar; 89 fir = a->data[a->top]; 90 a->top--; 91 sec = a->data[a->top]; 92 a->top--; 93 topchar = b->data[b->top]; //b的栈顶出栈 94 b->top--; 95 resultval = yunsuan(sec,fir,topchar); 96 a->top++; 97 a->data[a->top] = resultval; 98 return(resultval); 99 } 100 101 //表达式求值 102 int result(SeqStack *a, SeqStackchar *b) 103 { 104 char val[9] = {'4','+','4','/','2','-','9','*','3'}; //创建表达式 105 int i,resultval; 106 int x,y; 107 char c; 108 int n = sizeof(val); 109 for(i = 0; i < n; i++) 110 { 111 c = val[i]; //获取表达式第i个值 112 if(i%2 == 0) //把数字和符号区分开来, 113 { 114 a->top++; 115 a->data[a->top] = c - '0'; //存放数值的 116 } 117 else //存放符号的 118 { 119 if(b->top == -1) //如果b为空则直接存入符号 120 { 121 b->top++; 122 b->data[b->top] = c; 123 } 124 else 125 { 126 x = youxianquan(c); //求出当前符号的优先级 127 y = youxianquan(b->data[b->top]); //求b栈顶的符号优先级 128 if(x > y) //如果当前优先级大于栈顶优先级,则进栈 129 { 130 b->top++; 131 b->data[b->top] = c; 132 } 133 else 134 { 135 resultval = abyunsuan(a,b); //否则a的前两个出栈,b的栈顶出栈,然后进行运算,运算结果再进栈a; 136 b->top++; 137 b->data[b->top] = c; 138 } 139 } 140 } 141 while(i == n - 1 && a->top != -1 && b->top != -1) //当运算符输入完时 即当所有的字符全部输入完时才执行此循环 142 { 143 resultval = abyunsuan(a,b); 144 } 145 }
//也可以把上面的一个while循环注释掉,然后加上下面的循环;
/*
while(a=>top != -1 && b->top != -1)
resultval = abyunsuan(a,b);
*/
146 return resultval; 147 } 148 149 void main() 150 { 151 SeqStack *a; 152 SeqStackchar *b; 153 int resultval; 154 a = creat_sa(); //创建链表a 155 b = creat_sb(); //创建链表b 156 resultval = result(a,b); 157 printf("%d",resultval); 158 159 }