C/C++数据结构---在一个数组中实现两个堆栈(PTA)

这篇具有很好参考价值的文章主要介绍了C/C++数据结构---在一个数组中实现两个堆栈(PTA)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页

仍有未知等待探索_数据结构,C语言疑难,小项目-CSDN博客

专题分栏---数据结构

数据结构_仍有未知等待探索的博客-CSDN博客

目录

一、前言        

二、题目

要求

函数接口定义

裁判测试程序样例

输入样例 

输出样例 

三、分析 

1.栈的特点

2.题目分析 

3.栈的创建

4.入栈

5.出栈 

四、总代码


一、前言        

 今天写老师留的PTA的作业时,遇到一个非常不一样的栈,我觉得应该把它写出来,让大家眼前一亮 ,扩展一下视野,并且也能让我有更深层次的理解!

二、题目

要求

本题要求在一个数组中实现两个堆栈。

函数接口定义:

Stack CreateStack( int MaxSize ); //栈的创建
bool Push( Stack S, ElementType X, int Tag );//入栈 
ElementType Pop( Stack S, int Tag );//出栈

其中Tag是堆栈编号,取1或2;MaxSize堆栈数组的规模;

Stack结构定义如下: 

typedef int Position;
struct SNode {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则Pop函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。

裁判测试程序样例

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

#define ERROR 1e8
typedef int ElementType;
typedef enum { push, pop, end } Operation;
typedef enum { false, true } bool;
typedef int Position;
struct SNode {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

Stack CreateStack( int MaxSize );//栈的创建
bool Push( Stack S, ElementType X, int Tag );//入栈
ElementType Pop( Stack S, int Tag );//出栈

Operation GetOp();  /* details omitted *///操作
void PrintStack( Stack S, int Tag ); /* details omitted *///打印

int main()
{
    int N, Tag, X;
    Stack S;
    int done = 0;

    scanf("%d", &N);
    S = CreateStack(N);
    while ( !done ) {
        switch( GetOp() ) {
        case push: 
            scanf("%d %d", &Tag, &X);
            if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag);
            break;
        case pop:
            scanf("%d", &Tag);
            X = Pop(S, Tag);
            if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag);
            break;
        case end:
            PrintStack(S, 1);
            PrintStack(S, 2);
            done = 1;
            break;
        }
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例 

5
Push 1 1
Pop 2
Push 2 11
Push 1 2
Push 2 12
Pop 1
Push 2 13
Push 2 14
Push 1 3
Pop 2
End

输出样例 

Stack 2 Empty
Stack 2 is Empty!
Stack Full
Stack 1 is Full!
Pop from Stack 1: 1
Pop from Stack 2: 13 12 11

三、分析 

在写之前,我们要明白,什么是在一个数组里面实现两个堆栈。堆栈好理解,就是线性表的一种特殊的形式。

栈,不像正常的顺序表那样能完成增删改查的操作,栈只能进行入栈和出栈的操作。虽然操作的形式变少了,但是栈也有自己的优点,他的入栈和出栈的时间复杂度为O(1),相比正常的顺序表快了不少。

1.栈的特点

1、后进先出     2、入栈和出栈的时间复杂度为O(1)

一般栈的数据类型为:

#define MaxSize 1000
typedef int elemtype; 
struct LNode
{
    elemtype data[MaxSize];
    int top;栈顶指针,存储的是栈顶上的下标
}

2.题目分析 

根据题目所说的一个数组开辟两个堆栈,如图所示:

C/C++数据结构---在一个数组中实现两个堆栈(PTA),PTA,数据结构,c语言

栈顶指针Top1,Top2的初始位置分别为-1,和MaxSize。题目中的Tag变量存的是堆栈的编号,当Tag==1时,指的是栈顶指针为Top1的栈;Tag==2时,指的是栈顶指针为Top2的栈。

其中Top1为栈顶指针的栈是个正常的栈,而Top2为栈顶指针的栈是一个反向的栈,入栈的时候,要注意栈顶指针往左移,出栈的时候,栈顶指针往右移。

要注意栈满的时候的条件:Top1+1==Top2,如图所示:

C/C++数据结构---在一个数组中实现两个堆栈(PTA),PTA,数据结构,c语言

3.栈的创建

typedef int Position;
struct SNode {
    ElementType *Data;
    Position Top1, Top2;
    int MaxSize;
};
typedef struct SNode *Stack;

根据题目给的栈的类型可知:首先,需要给栈类型开辟空间、指针Data开辟空间。

然后需要给两个不同的栈顶变量赋初值。不要忘了,栈类型里面还有MaxSize变量也要赋初值。

Stack CreateStack(int MaxSize)
{
    Stack s = (Stack)malloc(sizeof(struct SNode));
    s->Data = (int*)malloc(sizeof(ElementType) * MaxSize);
    s->Top1 = - 1;
    s->Top2 = MaxSize;
    s->MaxSize = MaxSize;
    return s;
}

4.入栈

在入栈前要先判断一下栈是否已经满了,满了的条件根据上述讲解,可知S->Top1+1 == S->Top2。如果没满的话,根据Tag的来分辨是栈顶指针是Top1还是栈顶指针是Top2的。最后先栈顶指针Top1++或Top2--;再赋初值。

bool Push(Stack S, ElementType X, int Tag)
{
    if (S->Top1+1 == S->Top2)
    {
        printf("Stack Full\n");
        return false;
    }
    if (Tag == 1)
    {
         S->Top1++;
         S->Data[S->Top1] = X;
    }
    if(Tag==2)
    {
        S->Top2--;
        S->Data[S->Top2] = X;
    }
    return true;
}

5.出栈 

出栈也是一样的,先判断栈是否为空,如果不为空,那就栈顶指针Top1--或Top2++

ElementType Pop(Stack S, int Tag)
{
    if (Tag == 1)
    {
        if (S->Top1 == -1)       
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top1--];   
    }

    if (Tag == 2)
    {
        if (S->Top2 == S->MaxSize) 
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top2++];
    }
}

四、总代码

Stack CreateStack(int MaxSize)
{
    Stack s = (Stack)malloc(sizeof(struct SNode));
    s->Data = (int*)malloc(sizeof(ElementType) * MaxSize);
    s->Top1 = - 1;
    s->Top2 = MaxSize;
    s->MaxSize = MaxSize;
    return s;
}
bool Push(Stack S, ElementType X, int Tag)
{
    if (S->Top1+1 == S->Top2)
    {
        printf("Stack Full\n");
        return false;
    }
    if (Tag == 1)
    {
         S->Top1++;
         S->Data[S->Top1-1] = X;
    }
    if(Tag==2)
    {
        S->Top2--;
        S->Data[S->Top2+1] = X;
    }
    return true;
}
ElementType Pop(Stack S, int Tag)
{
    if (Tag == 1)
    {
        if (S->Top1 == -1)       
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top1--];   
    }

    if (Tag == 2)
    {
        if (S->Top2 == S->MaxSize) 
        {
            printf("Stack %d Empty\n", Tag);
            return ERROR;
        }
        return S->Data[S->Top2++];
    }
}

C/C++数据结构---在一个数组中实现两个堆栈(PTA),PTA,数据结构,c语言

谢谢大家的支持! 文章来源地址https://www.toymoban.com/news/detail-715017.html

到了这里,关于C/C++数据结构---在一个数组中实现两个堆栈(PTA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 将两个递增的有序链表合并为一个递增的有序链表.【数据结构】【线性表】

    编写一个函数完成如下功能:将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来的链表空间,不另外占用其他的存储空间。表中不允许有重复的数据。 要求,在主函数中调用上面的函数测试。 提示:还需要定义其他函数,比如初始化链表,构造单

    2024年02月06日
    浏览(39)
  • 【数据结构】什么是堆,如何使用无序数组生成一个堆?

    堆(Heap)是计算机科学中一类特殊的数据结构的统称,堆 通常是一个可以被看做一棵完全二叉树的数组对象 。如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的 顺序存储方式存储 在一个一维数组中 ,并满足: = 且 = ( = 且 = ) i = 0,1, 2…,则称为

    2024年02月06日
    浏览(24)
  • 数据结构 | 后缀表达式【深入剖析堆栈原理】

    Hello,大家好,国庆的第二天,带来的是数据结构中堆栈部分的后缀表达式,这也是一块有关栈的应用方面困扰了众多同学的一个大难题,今天就让我们一起解决这个难题📕 后缀表达式也称为 逆波兰表达式 ,也就是将算术运算符放在操作数的后面 例如【1 + 2 * 3】的后缀表达

    2023年04月27日
    浏览(35)
  • 【数据结构】12 堆栈应用:表达式求值

    有一个常量表达式的中缀表达式为:5 + 6 / 2 - 3 * 4,其后缀形式表示为: 5 6 2 / + 3 4 × -。后缀表达式的特点是运算符位于两个预算数之后。其前缀表达式为: - + 5 / 6 2 × 3 4。 后缀表达式相比于中缀表达式的求值要容易很多。 从左到右扫描该表达式: (1)遇见运算数5 6 2时不

    2024年02月20日
    浏览(41)
  • 【数据结构 C语言版】第四篇 栈、堆栈、Stack(超级详细版)

    写在前面 更新情况记录: 最近更新时间 更新次数 2022/10/18 1 参考博客与书籍以及链接: (非常感谢这些博主们的文章,将我的一些疑问得到解决。) 参考博客链接或书籍名称 《数据结构》陈越 代码随想录 总目录:目前数据结构文章太少,没有写。 正文 如果你c语言还有困

    2023年04月09日
    浏览(25)
  • 数据结构2.2,将两个非递减的有序链表合并为一个非递增的有序链表,要求结果链表仍使用原来两个链表的存储空间,不占用其他的存储空间。表中允许有重复的数据。

    大概思路:1.先写出建立链表的函数(creatlist):分配头节点,尾指针置空。 2.写出插入节点的代码函数:申请一片空间存放要插入的节点,把新插入的节点置空,令指向链表的头节点的下一个指针指向该节点,在把该指针指向新插入的节点。用if函数写出当输入的指小于零时

    2024年02月05日
    浏览(34)
  • 【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

       堆栈Stack 和 队列Queue 是两种非常重要的数据结构,两者都是特殊的线性表: 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。    堆

    2024年02月07日
    浏览(36)
  • python数据结构中实现队列的几种方法

    运行结果: 首尾指针实现 链队 首尾指针实现链队 尾插有头结点实现链队 链队 尾插法 有头结点实现链队 两个栈实现一个队列 list栈

    2024年01月18日
    浏览(30)
  • 数据结构:两个顺序表合并算法

            将a,b两个有序顺序表进行合并,放在c顺序表当中,并且要保证顺序表c仍然有序。         因为a,b两个顺序表是有序的,所有可以从前往后一起查找a,b当中最小的一个数值,放入到c中。         如果遍历到最后,a遍历完了,b没有遍历完,就把b剩下的放入

    2024年02月08日
    浏览(29)
  • 【数据结构经典题目】—两个队列实现栈与两个栈实现队列

    ​                                           食用指南:本文在有C基础的情况下食用更佳                                            🔥 这就不得不推荐此专栏了: C语言                                         🍀

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包