如何使用C语言设计一个顺序栈来实现一个能够处理混合运算(包括加法、减法、乘法和除法)的简单计算器功能?
时间: 2024-10-20 15:11:19 浏览: 34
在C语言中,我们可以使用数组作为顺序栈来实现一个简单的计算器。首先,我们需要定义栈结构,包含数据元素(这里是一个整数)和栈顶指针。接下来,我们设计几个函数:
1. **创建栈** (`create_stack`): 初始化栈的大小和栈顶指针。
```c
typedef struct Stack {
int* data;
int size;
int top;
} Stack;
Stack create_stack(int capacity) {
Stack stack = {malloc(capacity * sizeof(int)), capacity, -1};
return stack;
}
```
2. **入栈操作** (`push`): 当有新的运算符或数字进入计算时,推入栈中。
```c
void push(Stack* stack, int value) {
if (stack->top < stack->size - 1)
stack->data[++stack->top] = value;
}
```
3. **出栈操作** (`pop`): 从栈顶取出值,用于处理当前运算。
```c
int pop(Stack* stack) {
if (stack->top == -1)
return -1; // 栈空异常
else
return stack->data[stack->top--];
}
```
4. **执行计算** (`calculate`): 使用栈来存储运算过程,例如遇到一个数字就推入栈,遇到运算符则弹出两个数字做相应的运算,并将结果压回栈。
```c
int calculate(Stack* stack) {
while (!stack->top <= 0 && peek(stack) != '+') {
int op2 = pop(stack);
int op1 = pop(stack);
switch (peek(stack)) {
case '+':
push(stack, op1 + op2);
break;
case '-':
push(stack, op1 - op2);
break;
case '*':
push(stack, op1 * op2);
break;
case '/':
if (op2 != 0)
push(stack, op1 / op2);
else
printf("Error: Division by zero\n");
break;
default:
printf("Invalid operator\n");
return -1;
}
}
return pop(stack); // 返回最终结果
}
int peek(Stack* stack) {
return stack->top >= 0 ? stack->data[stack->top] : -1;
}
```
5. **主函数** (`main`): 用户输入表达式,按需调用上述函数。
```c
int main() {
char input[100];
scanf("%s", input);
Stack stack = create_stack(10);
int i = 0;
while (input[i]) {
if (isdigit(input[i])) {
push(&stack, input[i] - '0');
} else {
push(&stack, calculate(&stack));
}
i++;
}
if (stack.top != -1) {
printf("Result: %d\n", stack.data[stack.top]);
} else {
printf("Error: Invalid expression or empty\n");
}
free(stack.data);
return 0;
}
```
阅读全文