数据结构-第三章-顺序栈-两种栈顶指针指示方法实现各种基本功能

简介: 数据结构-第三章-顺序栈-两种栈顶指针指示方法实现各种基本功能

两种栈顶指针指示方法实现各种基本功能

**文件名后缀应为.cpp
文件名后缀应为.cpp
文件名后缀应为.cpp**

法一:
规定为栈顶指针指向有效栈首元素

法二:
规定为栈顶指针指向下一个要存储的元素的位置

Cpp代码如下

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MaxSize 20
#define ElemType int

typedef struct {
    ElemType data[MaxSize];
    int top;
} SqStack;

void InitStack( SqStack &S );                //定义 初始化顺序栈 函数
bool StackEmpty( SqStack S );                //定义 判断顺序栈空 函数
bool StackFull( SqStack S );                //定义 判断顺序栈满 函数
int StackLength( SqStack S );                //定义 返回栈的长度 函数
bool Push( SqStack &S, ElemType x );        //定义 推入栈 函数
bool Pop( SqStack &S, ElemType &x );        //定义 弹出栈 函数
bool GetTop( SqStack S, ElemType &x );        //定义 获取栈顶元素 函数
bool ClearStack( SqStack &S );                //定义 清空顺序栈 函数

void PrintStack( SqStack S );
int main() {

    srand( ( unsigned )time( NULL ) );

    SqStack S; //定义一个顺序栈
    InitStack( S ); //初始化顺序栈

    //测试栈空和满函数
    printf( "\n推入前:\n" );
    printf( "空结果:%d\n", StackEmpty( S ) );
    printf( "满结果:%d\n", StackFull( S ) );

    //测试推入栈函数
    for( int i = 0; i < 20; i++ ) {
        Push( S, i );
    }
    PrintStack( S );

    //测试栈空和满函数
    printf( "\n推入后:\n" );
    printf( "空结果:%d\n", StackEmpty( S ) );
    printf( "满结果:%d\n", StackFull( S ) );

    //测试 弹出栈函数
    printf( "弹出元素依次为:\n" );
    for( int i = 0; i < 5; i++ ) {
        int x;
        Pop( S, x );
        printf( "%d ", x );
    }
    printf( "\n" );
    PrintStack( S );

    //测试读取栈顶元素函数
    int x;
    if( GetTop( S, x ) ) {
        printf( "S.data[S.top]=%d\n", x );
    } else {
        printf( "栈空,读取失败!\n" );
    }

    //测试清空栈函数
    ClearStack( S );
    PrintStack( S );

    return 0;
}

//实现 初始化顺序栈 函数
void InitStack( SqStack &S ) {
    //法一:
//    S.top = -1;            //规定:栈顶指针指向有效栈首元素
    //法二:
    S.top = 0;        //规定:栈顶指针指向下一个要放的元素的位置

//    此处法一、法二 与以下函数中法一法二配套使用 !!!!!!!!
}

//实现 判断顺序栈空 函数
bool StackEmpty( SqStack S ) {
//    法1
//    if( S.top == -1 )
//        return true;
//    else
//        return false;
//  法二
    if( S.top == 0 )
        return true;
    else
        return false;
}

//实现 判断顺序栈满 函数
bool StackFull( SqStack S ) {
    //法一
//    if( S.top == MaxSize - 1 )
//        return true;
//    else
//        return false;

    //法二
    if( S.top == MaxSize )
        return true;
    else
        return false;
}

//实现 返回栈的长度 函数
int StackLength( SqStack S ) {
//    法一:
//    return S.top + 1;
//    法二:
    return S.top;
}

//实现 推入栈 函数
bool Push( SqStack &S, ElemType x ) {
    if( StackFull( S ) )    //判断栈是否满,若满则推入失败,返回false
        return false;
//    法一:
//    S.top++;
//    S.data[S.top] = x;

//    S.data[++S.top] = x;        //以上两句可由本句代替

//法二:
//    S.data[S.top] = x;
//    S.top++;

    S.data[S.top++] = x;        //以上两句可由本句代替

    return true;
}

//实现 弹出栈 函数
bool Pop( SqStack &S, ElemType &x ) {
    if( StackEmpty( S ) )
        return false;
//    法一:
//    x = S.data[S.top];
//    S.top--;

//    x = S.data[S.top--];        //以上两句可由本句代替

//    法二:
//    S.top--;
//    x = S.data[S.top];

    x = S.data[--S.top];        //以上两句可由本句代替
    return true;
}

//实现 获取栈顶元素 函数
bool GetTop( SqStack S, ElemType &x ) {
    if( StackEmpty( S ) )
        return false;
    //法一:
//    x = S.data[S.top];

    //法二:
    x = S.data[S.top - 1];
    return true;
}

//实现 清空顺序栈 函数
bool ClearStack( SqStack &S ) {
    //法一:
    S.top = -1;
    //法二:
    S.top = 0;
    return true;
}

void PrintStack( SqStack S ) {
    if( StackEmpty( S ) ) {
        printf( "栈空\n" );
        return;
    }

    printf( "当前栈元素为:\n" );

    //法一:
//    for( int i = 0; i <= S.top; i++ ) {
//        printf( "%d ", S.data[i] );
//    }

    //法二:
    for( int i = 0; i < S.top; i++ ) {
        printf( "%d ", S.data[i] );
    }

    printf( "\n共%d个元素\n", StackLength( S ) );
}
目录
相关文章
|
4天前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
1月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
38 7
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
44 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
46 9
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
196 6
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
81 4
|
3月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
72 0
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
55 1