2013年9月26日 星期四

[C/C++ 演算法]- 後序式的運算

[C/C++ 演算法]- 後序式的運算



剛才找資料時發現一個C/C++的教學網站,趕快發揮(C/P)的長才將它備份來,有需要的同好,歡迎來(C/P)一下^^。


拷貝來源:
http://openhome.cc/Gossip/AlgorithmGossip/
http://openhome.cc/Gossip/AlgorithmGossip/PostfixCal.htm









#include <stdio.h> 
#include <stdlib.h>

#define MAX 80

void
inToPostfix(char*, char*); // 中序轉後序
int priority(char); // 運算子優先
double eval(char*);
double
cal(char, double, double);

int
main(void) {
char
infix[MAX] = {'\0'};

printf("運算式:");
scanf("%s", infix);
printf("%f", eval(infix));

return
0;
}


void
inToPostfix(char* infix, char* postfix) {
char
stack[MAX] = {'\0'};
int
i, j, top;
for
(i = 0, j = 0, top = 0; infix[i] != '\0'; i++) switch(infix[i]) {
case
'(': // 運算子堆疊
stack[++top] = infix[i];
break
;
case
'+': case '-': case '*': case '/':
while
(priority(stack[top]) >= priority(infix[i])) {
postfix[j++] = stack[top--];
}

stack[++top] = infix[i]; // 存入堆疊
break;
case
')':
while
(stack[top] != '(') { // 遇 ) 輸出至 (
postfix[j++] = stack[top--];
}

top--; // 不輸出 (
break;
default
: // 運算元直接輸出
postfix[j++] = infix[i];
}

while
(top > 0) {
postfix[j++] = stack[top--];
}
}


int
priority(char op) {
switch
(op) {
case
'+': case '-': return 1;
case
'*': case '/': return 2;
default
: return 0;
}
}


double
eval(char* infix) {
char
postfix[MAX]= {'\0'};
char
opnd[2] = {'\0'};
double
stack[MAX] = {0.0};

inToPostfix(infix, postfix);

int
top, i;
for
(top = 0, i = 0; postfix[i] != '\0'; i++) switch(postfix[i]) {
case
'+': case '-': case '*': case '/':
stack[top - 1] = cal(postfix[i], stack[top - 1], stack[top]);
top--;
break
;
default
:
opnd[0] = postfix[i];
stack[++top] = atof(opnd);
}


return
stack[top];
}


double
cal(char op, double p1, double p2) {
switch
(op) {
case
'+': return p1 + p2;
case
'-': return p1 - p2;
case
'*': return p1 * p2;
case
'/': return p1 / p2;
}
}


 


沒有留言:

張貼留言