堆栈是一种线性数据结构,它遵循后进先出(LIFO)的原则进行操作。在计算机科学中,堆栈被广泛应用于多种场景,如函数调用、表达式求值等。本文将深入探讨堆栈的基本概念及其常见的存储结构,包括顺序存储和链式存储。
堆栈的核心特点是后进先出(LIFO),即最晚进入堆栈的数据元素会最先被移除。这种特性使得堆栈非常适合解决需要逆序处理的问题。
堆栈的基本操作包括:
顺序存储结构通过数组来实现堆栈。在数组中,每个元素都分配一个固定的索引位置,并且用一个指针指向当前的堆栈顶。这种方式的优点是访问速度快,因为可以直接通过索引来获取或设置值;缺点是插入和删除操作相对复杂。
typedef struct {
int *base; // 基地址
int top; // 栈顶指针
int stacksize; // 数组容量
} SqStack;
链式存储结构使用链表来实现堆栈。每个节点包含一个数据元素和指向下一个节点的指针,最顶层的数据元素由头指针直接指向。这种方式的优势在于插入和删除操作简单快捷,不需要移动其他元素;缺点是相比顺序存储需要额外的空间来存储指针。
typedef struct Node {
int data; // 节点数据
struct Node *next; // 指向下一个节点的指针
} LNode;
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
#define MAXSIZE 100
typedef struct {
ElemType data[MAXSIZE];
int top;
} SqStack;
// 初始化空栈
void InitStack(SqStack *S) {
S->top = -1;
}
// 入栈操作
bool Push(SqStack *S, ElemType e) {
if (S->top == MAXSIZE - 1)
return false; // 栈满,无法入栈
else {
S->data[++S->top] = e;
return true;
}
}
// 出栈操作
bool Pop(SqStack *S, ElemType *e) {
if (S->top == -1)
return false; // 栈空,无法出栈
else {
*e = S->data[S->top--];
return true;
}
}
// 获取栈顶元素
bool GetTop(SqStack *S, ElemType *e) {
if (S->top == -1)
return false; // 栈空,无法获取
else {
*e = S->data[S->top];
return true;
}
}
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} LNode, *LinkStack;
// 初始化空链表
void InitList(LinkStack *L) {
(*L) = (LinkStack)malloc(sizeof(LNode));
if (!(*L)) exit(0);
(*L)->next = NULL; // 链表头指针初始化为空
}
// 入栈操作
bool Push(LinkStack L, ElemType e) {
LinkStack p = (LinkStack)malloc(sizeof(LNode));
if (!p)
return false; // 内存分配失败,无法入栈
p->data = e;
p->next = L->next;
L->next = p;
return true;
}
// 出栈操作
bool Pop(LinkStack *L, ElemType *e) {
LinkStack p;
if ((*L)->next == NULL)
return false; // 栈空,无法出栈
else {
p = (*L)->next;
*e = p->data;
(*L)->next = p->next;
free(p);
return true;
}
}
// 获取栈顶元素
bool GetTop(LinkStack L, ElemType *e) {
if (L->next == NULL)
return false; // 栈空,无法获取
else {
*e = L->next->data;
return true;
}
}
堆栈作为一种重要的数据结构,在实际应用中有着广泛的应用。选择合适的存储结构可以有效提高算法的效率和性能。无论是顺序存储还是链式存储,都可以根据具体需求进行优化设计。