顺序栈操作(C语言代码)

顺序栈

 顺序栈是一种使用连续存储空间(如数组)来存储栈中元素的栈结构。它具有后进先出(LIFO, Last In First Out)的特性,即最后入栈的元素会首先出栈。

顺序栈的基本操作:

  1. 初始化(Initialization):

    • 创建一个空栈。
    • 通常需要指定栈的最大容量。
    • 设置栈顶指针,通常初始时设置为 -1 或 0,取决于具体实现。
  2. 入栈(Push):

    • 在栈顶添加一个元素。
    • 需要检查栈是否已满。
    • 若未满,将元素添加到栈顶,并更新栈顶指针。
  3. 出栈(Pop):

    • 移除并返回栈顶元素。
    • 需要检查栈是否为空。
    • 若不为空,返回栈顶元素,并更新栈顶指针。
  4. 查看栈顶元素(Peek):

    • 返回栈顶元素,但不移除它。
    • 同样需要检查栈是否为空。
  5. 判断栈空(IsEmpty):

    • 检查栈是否没有元素。
  6. 判断栈满(IsFull):

    • 检查栈是否已达到其最大容量。

使用场景:

  1. 函数调用栈:

    • 计算机程序中,函数调用的管理,尤其在没有嵌套调用和递归的情况下。
  2. 表达式求值:

    • 用于算术表达式的计算,尤其是将中缀表达式转换为后缀表达式时。
  3. 括号匹配:

    • 在编程语言的编译器设计中,用于检查括号是否正确匹配。
  4. 历史记录:

    • 如浏览器的后退功能,记录用户的浏览历史。
  5. 数据逆序:

    • 对数据进行逆序排列,例如字符串反转。

衍生:

  1. 双栈法:

    • 使用两个顺序栈来处理特定问题,如一个栈存储操作数,另一个存储操作符。
  2. 共享栈:

    • 两个栈共享同一个数组空间,但从两端向中间生长,可以有效利用空间。
  3. 动态顺序栈:

    • 当栈空间不足时,动态增加栈的容量。这通常通过重新分配数组并复制旧元素到新数组中实现。

顺序栈的主要优点是实现简单,数据访问快速。它的主要缺点是栈的大小在初始化时就固定了,这可能导致空间的浪费或栈溢出的问题。在实际应用中,应根据具体需求选择合适的栈实现方式。

以下是用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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanstuck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值