1.栈的概念:
1.栈是限定仅在表尾进行插入或删除的线性表。对于栈来说表尾具有特殊性,称为栈顶,相应表头被称为栈底。不含元素的空表被称为空栈。
2.栈的修改是按照先进后出的原则,因此栈又称为先进后出的线性表。
2.栈的基本操作:
1.栈的数据插入:表尾插入
2.栈的数据删除:表尾删除
3.站的初始化、判空以及取栈顶元素
3.代码实现(以c语言为例)
1.顺序栈(利用一组地址连续的存储单元依次存取自栈底到栈顶的元素)
cs
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 100
typedef struct {
int *top;
int *base;
int stacksize;
} Stack;
void initStack(Stack *p) {
p->base = (int *)malloc(STACKSIZE * sizeof(int));
if (p->base == NULL) {
printf("Memory allocation failed\n");
exit(1);
}
p->top = p->base;
p->stacksize = STACKSIZE;
}
int getTop(Stack *p, int *e) {
if (p->top == p->base) {
return -1; // Stack is empty
}
*e = *(p->top - 1);
return 0; // Success
}
void push(Stack *p, int m) {
if (p->top - p->base >= p->stacksize) {
p->base = (int *)realloc(p->base, (p->stacksize + STACKSIZE) * sizeof(int));
if (p->base == NULL) {
printf("Memory reallocation failed\n");
exit(1);
}
p->top = p->base + p->stacksize;
p->stacksize += STACKSIZE;
}
*p->top++ = m;
}
int pop(Stack *p, int *e) {
if (p->top == p->base) {
return -1; // Stack is empty
}
*e = *--p->top;
return 0; // Success
}
int main() {
Stack p;
int e, e1, e2;
initStack(&p);
push(&p, 3);
push(&p, 4);
push(&p, 5);
if (pop(&p, &e) == -1) {
printf("Stack is empty\n");
}
if (pop(&p, &e1) == -1) {
printf("Stack is empty\n");
}
if (pop(&p, &e2) == -1) {
printf("Stack is empty\n");
}
printf("%d, %d, %d\n", e, e1, e2);
// Free the allocated memory
free(p.base);
return 0;
}
运行结果
cs
5, 4, 3
2.也可以用链表实现栈。
4.应用场景:
1.括号匹配:
使用栈来验证字符串中的括号是否正确匹配。
2.浏览器历史记录:
浏览器使用栈来记录用户的访问历史,支持返回上一页的功能。
3.函数调用:
在程序运行时,函数调用的执行上下文会被压入调用栈中。
5.优缺点:
1.优点:实现简单,操作高效。支持先进后出的操作模式,适用于许多实际问题。
2.缺点:空间利用率可能不高(尤其是固定大小的数组实现),不支持随机访问,只能访问栈顶元素。