源代码:
#include <stdio.h>
#include <stdlib.h>
//程序目的:利用栈进行进制转换
typedef struct {
char data[20];
int top;
} Stack;
void Init(Stack *p) {
p->top = 0;
return;
}
int not_empty(Stack *p) {
return p->top;
}
int Push(Stack *p, char a) {
if (p->top == 10)
return 0;
else {
p->data[p->top] = a;
p->top++;
return 1;
}
}
int Pop(Stack *p, char *a) {
if (p->data == 0)
return 0;
else {
p->top--;
*a = p->data[p->top];
return 1;
}
}
int is_operater (char a) {
switch (a) {
case '+' :
case '-' :
case '*' :
case '/' :
return 1;
default :
return 0;
}
}
int Priority (char a) {
switch (a) {
case '+' :
case '-' :
return 1;
case '*' :
case '/' :
return 2;
}
}
int two_result (char op, char a, char b) {
switch (op) {
case '+' :
return (b + a);
case '-' :
return (b - a);
case '*' :
return (b * a);
case '/' :
return (b / a);
}
}
int main() {
Stack operater, operand, *s_operater = &operater, *s_operand = &operand;
int operand1, operand2, op, evalue, position = 0;
char expression[30];
Init (s_operater);
Init (s_operand);
printf("\nplease enter the inorder expression:");
gets(expression);
while (expression[position] != '\0' && expression[position] != '\n') {
if (is_operater (expression[position])) {
if (not_empty && Priority (expression[position]) <= Priority (s_operater->data[s_operater->top-1])) {
Pop (s_operand, &operand1);
Pop (s_operand, &operand2);
Pop (s_operater, &op);
Push (s_operand, two_result(op, operand1, operand2));
}
Push (s_operater, expression[position]);
}
else
Push (s_operand, expression[position]-48);
position++;
}
while (not_empty (s_operater)) {
Pop (s_operand, &operand1);
Pop (s_operand, &operand2);
Pop (s_operater, &op);
Push (s_operand, two_result(op, operand1, operand2));
}
Pop (s_operand, &evalue);
printf("The expression [%s] result is '%d'", expression, evalue);
return 0;
}
运行结果: