编写程序实现栈的基本操作,包括入栈、出栈、 取栈顶元素。 编写程序实现后缀表达式的求值算法,通过栈进 行运算符和操作数的处理。使用c语言实现
时间: 2024-10-25 09:11:15 浏览: 25
在C语言中,我们可以使用数组或链表来实现一个简单的栈结构,这里我会提供基本的栈操作函数示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义栈结构体
typedef struct Stack {
int capacity; // 栈容量
int top; // 栈顶指针
int* elements; // 存储数据的数组
} Stack;
// 初始化栈
Stack* createStack(int capacity) {
Stack* stack = (Stack*) malloc(sizeof(Stack));
stack->capacity = capacity;
stack->top = -1;
stack->elements = (int*) malloc(capacity * sizeof(int));
return stack;
}
// 入栈
void push(Stack* stack, int value) {
if (stack->top < stack->capacity - 1) {
stack->elements[++stack->top] = value;
} else {
printf("Stack overflow!\n");
}
}
// 出栈
int pop(Stack* stack) {
if (stack->top >= 0) {
return stack->elements[stack->top--];
} else {
printf("Stack underflow!\n");
return -1; // 返回错误码
}
}
// 取栈顶元素
int peek(Stack* stack) {
if (stack->top != -1) {
return stack->elements[stack->top];
} else {
printf("Stack is empty.\n");
return -1; // 返回错误码
}
}
// 示例后缀表达式求值
int evaluatePostfix(char* postfixExp) {
Stack* stack = createStack(100);
int num = 0, op = 0;
for (char c : postfixExp) {
if (isdigit(c)) {
num = num * 10 + c - '0';
} else {
while (!isOperatorEmpty(stack) && hasPrecedence(op, getOpType(c))) {
performOperation(stack, &num);
}
push(stack, c - '0'); // 如果遇到操作符,则压入栈
op = getOpType(c);
}
}
// 处理最后的操作符
while (!isOperatorEmpty(stack)) {
performOperation(stack, &num);
}
free(stack->elements);
free(stack);
return num;
}
// 辅助函数,检查栈是否为空、操作符是否有优先级等
// ... (省略实现)
int main() {
char postfixExp[] = "2 3 + 4 *";
int result = evaluatePostfix(postfixExp);
printf("Result of the expression is: %d\n", result);
return 0;
}
```
在这个示例中,我们实现了栈的基本操作(创建、入栈、出栈、查看栈顶元素),以及一个简单的后缀表达式求值算法。`evaluatePostfix`函数会根据后缀表达式的特点(从左到右扫描,遇到数字则推入栈,遇到操作符则弹出并计算直到找到一个优先级更低的操作符为止)来进行计算。
阅读全文