C语言实现栈数据结构的完整教程与代码示例
引言
简介
栈是一种线性数据结构,它是由相同类型的项组成的集合。
在栈中,元素的插入和删除仅发生在一个端点。栈的行为被描述为”后进先出”(LIFO)。当一个元素被”推入”栈时,它成为将要被”弹出”的第一项。为了访问最早输入的项,必须先弹出所有在其之后添加的项。
在本文中,你将学习关于栈数据结构的概念,以及在C语言中使用数组实现栈的方法。
对栈执行的操作
下面是栈所提供的基本操作:
- push(入栈):向栈顶添加一个元素。
- pop(出栈):移除栈顶的元素。
- isEmpty(判空):检查栈是否为空。
- isFull(判满):检查栈是否已满。
- top(取顶):显示栈顶的元素。
栈的基本机制
最初,设置一个指针(top),用于跟踪栈中最顶部的项。栈顶指针初始化为-1。
然后,通过比较栈顶指针与-1来进行检查,判断栈是否为空。
当元素被添加到栈中时,栈顶指针的位置会更新。
一旦元素被弹出或删除,最顶层的元素就会被移除,同时栈顶指针的位置会被更新。
在C语言中实现栈数据结构
栈可以使用结构体、指针、数组或者链表来表示。
这个例子在C语言中使用数组来实现栈。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 4
int top = -1, inp_array[SIZE];
void push();
void pop();
void show();
int main()
{
int choice;
while (1)
{
printf("\nPerform operations on the stack:");
printf("\n1.Push the element\n2.Pop the element\n3.Show\n4.End");
printf("\n\nEnter the choice: ");
scanf("%d", &choice);
switch (choice)
{
case 1:
push();
break;
case 2:
pop();
break;
case 3:
show();
break;
case 4:
exit(0);
default:
printf("\nInvalid choice!!");
}
}
}
void push()
{
int x;
if (top == SIZE - 1)
{
printf("\nOverflow!!");
}
else
{
printf("\nEnter the element to be added onto the stack: ");
scanf("%d", &x);
top = top + 1;
inp_array[top] = x;
}
}
void pop()
{
if (top == -1)
{
printf("\nUnderflow!!");
}
else
{
printf("\nPopped element: %d", inp_array[top]);
top = top - 1;
}
}
void show()
{
if (top == -1)
{
printf("\nUnderflow!!");
}
else
{
printf("\nElements present in the stack: \n");
for (int i = top; i >= 0; --i)
printf("%d\n", inp_array[i]);
}
}
这个程序向用户展示了四个选项:入栈、出栈、显示栈中元素和结束程序。用户可以通过输入相应的数字来选择要执行的操作。
- 推元素
弹出元素
显示
结束
等待用户输入一个数字。
- 如果用户选择1,程序将执行push()操作。首先,它会检查top是否等于SIZE – 1。如果为真,则显示”溢出!!”。否则,程序会要求用户提供要添加到栈中的新元素。
- 如果用户选择2,程序将执行pop()操作。首先,它会检查top是否等于-1。如果为真,则显示”下溢!!”。否则,将移除栈顶元素并显示结果栈。
- 如果用户选择3,程序将执行show()操作。首先,它会检查top是否等于-1。如果为真,则显示”下溢!!”。否则,程序将显示栈中的所有元素。
- 如果用户选择4,程序将退出。
执行此代码将数字”10″推送到栈上。
输出:在栈上执行操作:
1.推入元素
2.弹出元素
3.显示
4.结束
输入选择:1
输入要插入到栈中的元素:10
然后在堆栈上展示元素:
输出:在栈上执行操作:
1.推入元素
2.弹出元素
3.显示
4.结束
输入选择:3
栈中存在的元素:
10
然后弹出(pop())。
输出:在栈上执行操作:
1.推入元素
2.弹出元素
3.显示
4.结束
输入选择:2
弹出的元素:10
现在,堆栈是空的。再次尝试pop():
输出:在栈上执行操作:
1.推入元素
2.弹出元素
3.显示
4.结束
输入选择:3
下溢!!
继续尝试这个程序,以了解堆栈的工作原理。
栈操作的时间复杂度
在栈中一次只能访问一个元素。
在对栈执行push()和pop()操作时,它需要O(1)的时间。
结论
在这篇文章中,你学到了栈数据结构的概念以及在C语言中使用数组实现的方法。
堆栈被用来解决一些普遍的问题,比如:
- 汉诺塔(Tower of Hanoi)
N皇后问题(N-Queens Problem)
中缀转前缀(Infix to Prefix Conversion)
继续学习吧,学习如何在C语言中创建队列和如何初始化数组。