顺序栈
顺序栈是一种使用连续存储空间(如数组)来存储栈中元素的栈结构。它具有后进先出(LIFO, Last In First Out)的特性,即最后入栈的元素会首先出栈。
顺序栈的基本操作:
-
初始化(Initialization):
- 创建一个空栈。
- 通常需要指定栈的最大容量。
- 设置栈顶指针,通常初始时设置为 -1 或 0,取决于具体实现。
-
入栈(Push):
- 在栈顶添加一个元素。
- 需要检查栈是否已满。
- 若未满,将元素添加到栈顶,并更新栈顶指针。
-
出栈(Pop):
- 移除并返回栈顶元素。
- 需要检查栈是否为空。
- 若不为空,返回栈顶元素,并更新栈顶指针。
-
查看栈顶元素(Peek):
- 返回栈顶元素,但不移除它。
- 同样需要检查栈是否为空。
-
判断栈空(IsEmpty):
- 检查栈是否没有元素。
-
判断栈满(IsFull):
- 检查栈是否已达到其最大容量。
使用场景:
-
函数调用栈:
- 计算机程序中,函数调用的管理,尤其在没有嵌套调用和递归的情况下。
-
表达式求值:
- 用于算术表达式的计算,尤其是将中缀表达式转换为后缀表达式时。
-
括号匹配:
- 在编程语言的编译器设计中,用于检查括号是否正确匹配。
-
历史记录:
- 如浏览器的后退功能,记录用户的浏览历史。
-
数据逆序:
- 对数据进行逆序排列,例如字符串反转。
衍生:
-
双栈法:
- 使用两个顺序栈来处理特定问题,如一个栈存储操作数,另一个存储操作符。
-
共享栈:
- 两个栈共享同一个数组空间,但从两端向中间生长,可以有效利用空间。
-
动态顺序栈:
- 当栈空间不足时,动态增加栈的容量。这通常通过重新分配数组并复制旧元素到新数组中实现。
顺序栈的主要优点是实现简单,数据访问快速。它的主要缺点是栈的大小在初始化时就固定了,这可能导致空间的浪费或栈溢出的问题。在实际应用中,应根据具体需求选择合适的栈实现方式。
以下是用C语言实现顺序栈的基本操作的代码示例。这个示例包括了栈的创建、入栈、出栈、查看栈顶元素以及判断栈空和栈满的操作。
首先定义栈的结构和一些常量:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100 // 定义栈的最大容量
// 定义顺序栈的结构
typedef struct {
int data[MAX_SIZE]; // 存储栈元素的数组
int top; // 栈顶指针
} SeqStack;
接下来是栈的基本操作:
初始化栈(Initialization)
void initStack(SeqStack *stack) {
stack->top = -1;
}
入栈(Push)
bool push(SeqStack *stack, int element) {
if (stack->top >= MAX_SIZE - 1) { // 检查栈是否已满
return false;
}
stack->top++;
stack->data[stack->top] = element;
return true;
}
出栈(Pop)
bool pop(SeqStack *stack, int *element) {
if (stack->top == -1) { // 检查栈是否为空
return false;
}
*element = stack->data[stack->top];
stack->top--;
return true;
}
查看栈顶元素(Peek)
bool peek(SeqStack *stack, int *element) {
if (stack->top == -1) { // 检查栈是否为空
return false;
}
*element = stack->data[stack->top];
return true;
}
判断栈空(IsEmpty)
bool isEmpty(SeqStack *stack) {
return stack->top == -1;
}
判断栈满(IsFull)
bool isFull(SeqStack *stack) {
return stack->top >= MAX_SIZE - 1;
}
总体:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 100
using namespace std;
typedef struct SqStack{
int data[Maxsize];
int top;
}SqStack;
/*
栈顶指针:S.top,初始时设置S.top=-1,;栈顶元素:S.data[S.top]。
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。
出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减一。
栈空条件:S.top==-1;栈满条件:S.top==Maxsize-1;栈长:S.top+1
*/
//初始化
int Init_Sqstack(SqStack &S)
{
S.top=-1;
}
//进栈
bool push_SqStack(SqStack &S,int x)
{
if(S.top==Maxsize-1)
return false;//栈满
S.data[++S.top]=x;
return true;
}
//出栈
bool pop_SqStack(SqStack &S,int &x)
{
if(S.top==-1)
return false;
x=S.data[S.top];
S.top--;
return true;
}
//获取栈顶元素
bool GetTop(SqStack S,int &x)
{
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
void show_SqStack(SqStack S)
{
for(int i=0;i<=S.top;i++)
{
printf("%d ",S.data[i]);
}
}
int main()
{
SqStack S;
Init_Sqstack(S);
push_SqStack(S,1);
push_SqStack(S,2);
push_SqStack(S,3);
show_SqStack(S);
int a=0;
pop_SqStack(S,a);
printf("%d \n",a);
show_SqStack(S);
GetTop(S,a);
printf("%d \n",a);
}