C语言四则运算多项运算先输入式子再输出结果需分优先级输入一个式子,例如:1+3*6+6/3遇等号输出结果21

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/06 03:52:24

C语言四则运算多项运算先输入式子再输出结果需分优先级输入一个式子,例如:1+3*6+6/3遇等号输出结果21
C语言四则运算多项运算先输入式子再输出结果需分优先级
输入一个式子,例如:1+3*6+6/3遇等号输出结果21

C语言四则运算多项运算先输入式子再输出结果需分优先级输入一个式子,例如:1+3*6+6/3遇等号输出结果21
给你个完整代码,支持整数的四则运算,不支持括号,不支持浮点,可以扩展
#include <stdio.h>
#include <string.h>
#define N 3
struct stack {
union {
int data[N]; // 保存数字 
char op[N];  // 保存操作符 
};
int top;
};
// 操作数的栈操作 
int pushint(struct stack *s, int number) 

if(s->top >= N-1) 
return -1; 
s->data[++s->top] = number; 
return number;
}
int popint(struct stack *s) 
{
int n;
if(s->top == -1) 
return -1; 
n = s->data[s->top--];
return(n); 
}
// 操作符的栈操作 
int pushchar(struct stack *s, char c) 

if(s->top >= N-1) 
return -1; 
s->op[++s->top] = c; 
return c;
}
char popchar(struct stack *s) 

if(s->top == -1) 
return -1; 
return(s->op[s->top--]); 
}
char topchar(struct stack *s)
{
if(s->top == -1)
return '\0';
return s->op[s->top];
}
// 计算加减乘除运算 
int calc(int n1, int n2, char op)
{
switch(op) {
case '+': return n1 + n2;
case '-': return n1 - n2;
case '*': return n1 * n2;
case '/': return n1 / n2;
}
}
// 获得字符串中的数字 
int getnumber(char *expression, int *n)
{
int i=0, flag=0;
*n = 0;
while(expression[i] == ' ' || expression[i] == '\t')
i++;
while(expression[i] >= '0' && expression[i]<='9') {
*n = *n * 10 + expression[i] - '0';
i ++;
flag = 1;
}
if(flag == 0)
return 0;
return i;
}
// 获得字符串中的操作符 
int getop(char *expression, char *op)
{
int i = 0;
while(expression[i] == ' ' || expression[i] == '\t')
i++;
if(expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/')
*op = expression[i++];
else
return 0;
return i;
}
// 获得操作符的优先级 
int get_priority(char op)
{
switch(op) {
case '+': return 1;
case '-': return 1;
case '*': return 2;
case '/': return 2;
}
}
// 比较操作符的优先级 
int compare_priority(struct stack op, char op2)
{
if(op.top == -1)
return 0;
if(get_priority(topchar(&op)) >= get_priority(op2))
return 1;
return 0;
}
main()
{
struct stack number, op;
char expression[100], c;
int index, len, n, result;
number.top = -1;
op.top = -1;
gets(expression);
index = getnumber(expression, &n);
if(index == 0) {
printf("表达式错误\n");
return 0;
}
pushint(&number, n);
do {
len = getop(expression+index, &c);
if(len == 0) {
printf("表达式错误\n");
return 0;
}
index += j;
len = getnumber(expression+index, &n);
if(len == 0) {
printf("表达式错误\n");
return 0;
}
index += len;
while(compare_priority(op, c) > 0) {
result = calc(popint(&number), popint(&number), popchar(&op));
pushint(&number, result);
}
pushint(&number, n);
pushchar(&op, c);
} while(expression[index] != '\0');
do {
result = calc(popint(&number), popint(&number), popchar(&op));
if(topchar(&op) != 0)
pushint(&number, result);
} while(topchar(&op) != 0);
printf("\n%s = %d", expression, result);
}