堆栈(Stack)是一种 线性数据结构,它遵循“后进先出”(Last-In-First-Out, LIFO)的原则,即最后插入的元素最先被移除。在计算机编程中,堆栈主要用于存储临时数据,支持递归调用、函数调用、括号匹配、表达式求值等。
堆栈的基本操作包括:
压栈(Push):
将一个元素添加到堆栈的顶部。
弹栈(Pop):
从堆栈的顶部移除一个元素。
查看栈顶元素(Peek/Top):
返回堆栈顶部的元素,但不移除它。
判空(IsEmpty):
检查堆栈是否为空。
判满(Is Full):
检查堆栈是否已满(仅适用于有固定大小的堆栈)。
在C语言中实现堆栈
定义堆栈存储空间:
通常使用数组来实现堆栈。
初始化栈顶指针:
栈顶指针通常初始化为-1,表示堆栈为空。
压栈操作:
在栈顶指针加1后,将元素放入数组中栈顶指针所指向的位置。
弹栈操作:
先取出栈顶指针所指向的元素,然后将栈顶指针减1。
判空和判满操作:
在压栈和弹栈操作前,需要检查堆栈是否为空或已满。
示例代码:
```c
include define MAX_SIZE 100 int stack[MAX_SIZE]; // 堆栈的存储空间 int top = -1; // 栈顶指针 // 压栈操作 void push(int data) { if (top >= MAX_SIZE - 1) { printf("Stack Overflow\n"); return; } stack[++top] = data; } // 弹栈操作 int pop() { if (top < 0) { printf("Stack Underflow\n"); return -1; } return stack[top--]; } // 查看栈顶元素 int peek() { if (top < 0) { printf("Stack is empty\n"); return -1; } return stack[top]; } // 初始化堆栈 void init() { top = -1; } int main() { init(); push(1); push(2); printf("Top element: %d\n", peek()); // 输出: Top element: 2 pop(); printf("Top element: %d\n", peek()); // 输出: Top element: 1 return 0; } ``` 堆栈的应用 存储函数的参数、局部变量和返回地址。 用于处理后缀表达式(逆波兰表示法)等。 检查表达式中的括号是否匹配。 在递归算法中,用于保存和恢复状态。 通过以上步骤和示例代码,你可以在C语言中实现一个基本的堆栈,并利用它在各种编程场景中。函数调用:
表达式求值:
括号匹配:
回溯算法: