C 语言栈

2024 年 8 月 28 日 | 阅读 6 分钟

是计算机科学中的一种基本数据结构,遵循后进先出(LIFO)规则。它类似于一摞书,最后放上去的书最先被取走。栈在编程中非常常用,用途广泛。在这篇博文中,我们将探讨 C 语言中栈的概念,以及它的实现、语法、代码示例和相应的输出。

是由可以通过入栈(push)出栈(pop)操作访问的元素集合组成的。出栈操作将栈顶元素移除,而入栈操作将元素添加到栈顶。窥探(peek)操作也可以在不删除的情况下检查栈顶元素。

在 C 语言中,可以使用数组或链表来实现栈。由于其简单性和广泛使用,本文将重点介绍基于数组的实现。

C 语言中栈结构的定义

在这里,我们定义了一个名为 Stack 的结构,它包含一个名为 arr 的整数数组和一个名为 top 的整数,用于标识当前位于栈顶的元素。MAX_SIZE 常量表示栈的最大容量。

在使用栈之前,我们必须通过将 top 变量初始化为 -1 来初始化它,这表示一个空栈。此处显示了初始化函数

执行入栈操作时,会将元素添加到栈顶。top 变量递增,然后将新元素插入到相应的索引处。让我们来实现入栈操作

在上面的代码中,我们检查栈是否已满(top == MAX_SIZE - 1)。如果是,我们则不进行任何操作并返回,同时打印一条消息表示栈溢出。

出栈操作会移除栈顶元素。为了模拟移除,我们将 top 变量递减。让我们来实现出栈操作

上面的代码检查栈是否为空(top == -1)。在这种情况下,我们返回一个错误值(此处为 -1)来指示栈下溢条件,并打印一条错误消息表示栈下溢。

我们可以使用窥探(peek)方法检查栈顶元素而无需将其移除。下面是实现方法

上面的代码检查栈是否为空(top == -1)。如果栈为空,我们会打印一条错误消息并返回一个无效值 (-1)

示例

现在,让我们编写一个简单的程序来演示栈操作的工作原理。我们将向栈中添加几个元素,移除一个,然后窥探栈顶元素。

输出

Top element: 30
Popped element: 30
Top element after popping: 20

以下是栈数据结构的应用程序

1. 括号匹配

输出

Enter an expression: (a + b) * (c - d)
Parentheses are balanced.

说明

该程序使用栈来确定表达式中的括号是否平衡。在每次迭代中,它会遍历表达式中的每个字符,并将开括号压入栈中。遇到闭括号时,它会从栈中弹出一个元素。如果迭代结束时栈为空,则表示表达式平衡且所有括号都已匹配。

2. 中缀转后缀

输出

Enter an infix expression: (a + b) * c - d
Postfix expression: ab+c*d-

说明

使用栈,该程序可以将中缀表达式转换为后缀表示法。根据运算符括号的顺序,它会遍历中缀表达式中的每个字符并执行相应的操作。通过从栈中弹出运算符并将其添加到输出字符串中,即可生成后缀表达式

3. 撤销/重做功能

输出

Undo operation: Replace text
Redo operation: Replace text

说明

该程序使用两个栈来演示撤销/重做能力。使用performOperation 函数模拟操作,并将结果压入撤销栈(undo stack)。调用undo 函数时,会从撤销栈中移除一个操作并将其放入重做栈(redo stack)redo 函数通过从重做栈弹出并将其推回撤销栈来执行相反的过程。

结论

总之,掌握栈数据结构及其在 C 语言中的实现对于高效编程至关重要。通过使用push、poppeek 操作,可以根据后进先出(LIFO)原则来操作栈中的元素。本博文中的基于数组的实现提供了一种简单且广泛使用的方法。通过管理栈溢出和栈下溢等潜在错误,我们可以确保栈的正确运行。掌握栈数据结构为有效解决各种编程问题和提高代码效率铺平了道路。