c语言实现两个整数的运算,运算符仅有四种:+、-、* 、/ ,但是以字符串的形式输入表达式。注意这里的除数结果是整数,即5/4=1。
时间: 2023-10-28 14:14:25 浏览: 148
可以使用堆栈(stack)数据结构来实现字符串表达式的计算。具体实现如下:
1. 定义一个操作数栈和一个操作符栈。
2. 从左到右遍历表达式字符串,每次遇到一个字符,判断它是数字还是运算符:
- 如果是数字,将其转换为整数并压入操作数栈。
- 如果是运算符,判断它的优先级:
- 如果优先级高于栈顶运算符,直接压入操作符栈。
- 如果优先级低于或等于栈顶运算符,将操作数栈中的两个操作数弹出,从操作符栈中弹出一个运算符,进行运算,将结果压入操作数栈,再将当前的运算符压入操作符栈。
3. 遍历完整个表达式后,操作符栈中可能还有剩余的运算符和操作数,继续进行运算,直到操作符栈为空,操作数栈中只剩下一个结果。
下面是使用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100
typedef struct {
int data[MAX_STACK_SIZE];
int top;
} Stack;
void initStack(Stack* s) {
s->top = -1;
}
int isEmpty(Stack* s) {
return s->top == -1;
}
int isFull(Stack* s) {
return s->top == MAX_STACK_SIZE - 1;
}
void push(Stack* s, int x) {
if (isFull(s)) {
printf("Stack overflow\n");
exit(1);
}
s->data[++s->top] = x;
}
int pop(Stack* s) {
if (isEmpty(s)) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top--];
}
int peek(Stack* s) {
if (isEmpty(s)) {
printf("Stack empty\n");
exit(1);
}
return s->data[s->top];
}
int priority(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
int evaluate(char* expr) {
Stack opndStack; // 操作数栈
Stack optrStack; // 操作符栈
initStack(&opndStack);
initStack(&optrStack);
int i = 0, j, n = strlen(expr), x, y;
while (i < n) {
if (isdigit(expr[i])) {
x = 0;
while (i < n && isdigit(expr[i])) {
x = x * 10 + (expr[i] - '0');
i++;
}
push(&opndStack, x);
}
else if (expr[i] == '+' || expr[i] == '-' || expr[i] == '*' || expr[i] == '/') {
while (!isEmpty(&optrStack) && priority(expr[i]) <= priority(peek(&optrStack))) {
y = pop(&opndStack);
x = pop(&opndStack);
switch (pop(&optrStack)) {
case '+':
push(&opndStack, x + y);
break;
case '-':
push(&opndStack, x - y);
break;
case '*':
push(&opndStack, x * y);
break;
case '/':
push(&opndStack, x / y);
break;
}
}
push(&optrStack, expr[i]);
i++;
}
else {
i++;
}
}
while (!isEmpty(&optrStack)) {
y = pop(&opndStack);
x = pop(&opndStack);
switch (pop(&optrStack)) {
case '+':
push(&opndStack, x + y);
break;
case '-':
push(&opndStack, x - y);
break;
case '*':
push(&opndStack, x * y);
break;
case '/':
push(&opndStack, x / y);
break;
}
}
return pop(&opndStack);
}
int main() {
char expr[100];
printf("Enter an expression: ");
scanf("%s", expr);
int result = evaluate(expr);
printf("Result: %d\n", result);
return 0;
}
```
注意,上面的代码只能处理整数的四则运算,不支持括号和负数等其他运算符和表达式形式。