C语言用栈结构编写一个程序
时间: 2023-06-20 11:04:19 浏览: 42
以下是一个使用栈结构实现四则运算的C语言程序:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int top;
float data[MAX_SIZE];
} Stack;
void init(Stack *s) {
s->top = -1;
}
int is_empty(Stack *s) {
return s->top == -1;
}
int is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, float x) {
if (is_full(s)) {
printf("Stack is full\n");
exit(1);
}
s->top++;
s->data[s->top] = x;
}
float pop(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty\n");
exit(1);
}
float x = s->data[s->top];
s->top--;
return x;
}
float peek(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty\n");
exit(1);
}
return s->data[s->top];
}
int is_op(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int precedence(char op) {
if (op == '+' || op == '-') {
return 1;
} else if (op == '*' || op == '/') {
return 2;
} else {
return 0;
}
}
float eval(char *expr) {
Stack num_stack;
Stack op_stack;
init(&num_stack);
init(&op_stack);
int i = 0;
while (expr[i] != '\0') {
if (isdigit(expr[i])) {
float num = 0;
while (isdigit(expr[i])) {
num = num * 10 + (expr[i] - '0');
i++;
}
push(&num_stack, num);
} else if (is_op(expr[i])) {
while (!is_empty(&op_stack) && precedence(peek(&op_stack)) >= precedence(expr[i])) {
float num2 = pop(&num_stack);
float num1 = pop(&num_stack);
char op = pop(&op_stack);
float result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
push(&num_stack, result);
}
push(&op_stack, expr[i]);
i++;
} else {
i++;
}
}
while (!is_empty(&op_stack)) {
float num2 = pop(&num_stack);
float num1 = pop(&num_stack);
char op = pop(&op_stack);
float result;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
}
push(&num_stack, result);
}
return pop(&num_stack);
}
int main() {
char expr[] = "3+4*5-2/3";
float result = eval(expr);
printf("%s = %.2f\n", expr, result);
return 0;
}
```
该程序使用两个栈,一个用于存储数字,另一个用于存储运算符。它可以计算带有加减乘除运算符的表达式。该程序中还实现了栈的基本操作,如初始化、判断栈是否为空、判断栈是否已满、入栈、出栈、查看栈顶元素等。