用c语言写出一个程序实现栈的入栈,出栈,取栈顶元素和遍历栈操作,基于顺序栈实现数值转换,括号匹配
时间: 2024-10-16 14:16:36 浏览: 39
顺序栈入栈出栈实现源码
5星 · 资源好评率100%
在C语言中,我们可以使用数组来实现一个简单的顺序栈。以下是一个基本的栈结构以及相应的入栈、出栈、取栈顶元素和遍历栈的操作:
```c
#include <stdio.h>
#define MAX_SIZE 50
// 定义栈结构
typedef struct {
int top;
int data[MAX_SIZE];
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否已满
int is_full(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 判断栈是否为空
int is_empty(Stack *s) {
return s->top == -1;
}
// 入栈操作
void push(Stack *s, int value) {
if (!is_full(s)) {
s->top++;
s->data[s->top] = value;
printf("Pushed element %d onto the stack.\n", value);
} else {
printf("Stack is full. Cannot push element.\n");
}
}
// 出栈操作
int pop(Stack *s) {
if (!is_empty(s)) {
int value = s->data[s->top];
s->top--;
printf("Popped element %d from the stack.\n", value);
return value;
} else {
printf("Stack is empty. No element to pop.\n");
return -1; // 返回一个特定值表示栈空
}
}
// 取栈顶元素
int peek(Stack *s) {
if (!is_empty(s)) {
return s->data[s->top];
} else {
printf("Stack is empty. No element on top.\n");
return -1; // 返回一个特定值表示栈空
}
}
// 遍历栈
void traverse(Stack *s) {
if (is_empty(s)) {
printf("Stack is empty.\n");
} else {
printf("Stack elements are: ");
for (int i = 0; i <= s->top; i++) {
printf("%d ", s->data[i]);
}
printf("\n");
}
}
// 示例:数值转换和括号匹配
void process_expression(Stack *stack, char expression[]) {
int start = 0;
for (int i = 0; expression[i]; ++i) {
if (expression[i] == '(') {
push(stack, i); // 栈里保存左括号的位置
} else if (expression[i] == ')') {
int leftParenPos = pop(stack); // 取栈顶的左括号位置
while (peek(stack) != '(' && leftParenPos > 0) {
// 括号不匹配,从左到右移除直到找到左括号为止
pop(stack);
leftParenPos--;
}
if (peek(stack) == '(') { // 如果栈顶还是左括号,则匹配成功
pop(stack); // 移除左括号
} else {
// 匹配失败,弹出所有剩余元素并结束处理
while (!is_empty(stack)) {
pop(stack);
}
break;
}
}
if (!is_empty(stack)) {
printf("Expression does not have matching parentheses.\n");
} else {
printf("Expression has valid parenthesis matching.\n");
}
}
int main() {
Stack myStack;
init(&myStack);
// 测试栈操作
push(&myStack, 1);
push(&myStack, 2);
push(&myStack, 3);
traverse(&myStack);
process_expression(&myStack, "((1+2)*3)");
return 0;
}
```
上述代码实现了基本的栈操作,包括入栈、出栈、取栈顶元素、遍历栈,并展示了如何用栈来进行括号匹配。注意,这个示例仅用于简单演示,实际应用可能需要更复杂的逻辑处理括号匹配。
阅读全文