首页 > 编程语言 >ADT栈与队列的编程与实现

ADT栈与队列的编程与实现

时间:2024-12-16 10:58:46浏览次数:6  
标签:ADT 队列 top 编程 int base Stack

ADT栈与队列的编程与实现

一 实验目的:
加深对抽象数据类型 ADT 栈和队列的理解。

二 实验环境:
Microsoft Visual C++ 2010

三 实验内容:
编写程序实现 ADT 栈的定义,及常用操作(数组或指针实现):

  1. 生成栈;
  2. Push
  3. Pop
    编写程序实现 ADT 队列的定义,及常用操作:
  4. 生成队列;
  5. Enqueues 入列;
  6. Isempty 判断是否队列为空。

四 实验步骤:
1.实验程序:
(1)ADT栈:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 100
typedef struct node
{
int *base;
int *top;
int s;
}Stack;

int MakeEmpty(Stack &S);
int Push(Stack &S,int d);
void Pop(Stack &S);
int Get(Stack S);
void GetAll(Stack &S);
int main(int argc, char* argv[])
{
int a;
int b;
int c;
Stack S;
if(MakeEmpty(S))
printf(“初始化成功\n”);

printf("输入要压入栈数据的个数:");
scanf("%d",&a);
for(int n=0;n<a;n++)
{
    printf("请输入压入栈的数据%d为:",n+1);
    scanf("%d",&b);
    Push(S,b);
}
GetAll(S);
printf("选择是否进行Pop操作,1为是,0为否:");
scanf("%d",&c);
if(c)
    Pop(S);
GetAll(S);
system("pause");
return 0;

}

int MakeEmpty(Stack &S)//初始栈空间
{
S.base=new int[MAXSIZE];
if(!S.base) return 0;
S.top=S.base;
S.s=MAXSIZE;
return 1;
}

int Push(Stack &S,int d)//压栈
{
if(S.top-S.base==S.s) return 0;
S.top++;
*S.top=d;
return 1;
}
//出栈
void Pop(Stack &S)//出栈
{
printf(“栈顶值为%d,已取出\n”,*S.top);
S.top–;
}

int Get(Stack S)//取栈
{
if(S.top!=S.base)
return *(S.top-1);
}

void GetAll(Stack &S)//遍历栈
{
int i;
if(S.top==S.base) printf(“栈为空\n”);
else
{
printf(“当前链表不为空,栈内数据如下\n”);
i=S.top-S.base;
for(int j=0;j<i;j++)
{
printf(“%d\n”,*(S.top-j));
}
}
}
(2)ADT队列:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct{
char data[6];
int Front;
int Rear;
int Size;
}Queue;
void MakeQueue(Queue *Q) //初始化队列
{
Q->Front =0;
Q->Rear =0;
Q->Size =0;
}
int IsEmpty(Queue *Q)//判断队列是否为空
{
return Q->Size ==0;
}
void EnQueue(Queue *Q,int x) //入队列
{
Q->data[Q->Rear]=x;
Q->Rear ++;
Q->Front =Q->Rear -1;
Q->Size ++;
}

int main()
{
Queue Q;
MakeQueue(&Q);

int m=Q.Rear;
for(int i=0;i<m;i++)
    printf("%d ",Q.data[i]);
if(IsEmpty(&Q))
    printf("\n队列为空\n");
else
    printf("\n队列不为空\n");
int f;
for(int k=0;k<6;k++)
{
    printf("\n请输入下一个想要入列的数:");
    scanf("%d",&f);
    EnQueue(&Q,f);
    printf("队列变为:");
    m=Q.Rear;
    int i;
    for(i=0;i<m;i++)
    printf("%d ",Q.data[i]);
        if(IsEmpty(&Q))
    printf("\n队列为空\n");
else
    printf("\n队列不为空\n");
}
system("pause");
return 0;

}

2.程序实验结果:
(1)ADT栈:生成栈、压栈结果:
在这里插入图片描述

出栈结果:
在这里插入图片描述

(2)ADT队列:
开始时队列数据为0,判断队列为空,之后添加数据,直到队列达到最大(6),则无法再添加数据。

在这里插入图片描述

3.分析和改进:
(1)ADT栈:
压栈:首先判断栈是否已满,满则不进行数据压栈,未满则将栈段指向压入数据。
出栈:一次出栈,出一个数据,栈顶指针减一。
栈遍历:判断Top指针是否与底部指向同一数据,然后有Top指针指向的数据开始,依次输出数据。
(2)ADT队列:
入队列:指向头元素的指针不动,指向尾部指针加一,同时记录队列长度的Size加一。
判断队列是否为空:Size初始为0,入队列后加一,根据Size的值判断队列是否为空
五 实验小结:
更进一步了解了ADT栈与队列的定义,实现了Push、Pop以及队列入元素和判断是否为空的操作。

标签:ADT,队列,top,编程,int,base,Stack
From: https://blog.csdn.net/m0_54748666/article/details/144500903

相关文章

  • 商城项目基于消息队列的TCC分布式事务控制改造-----商城项目
    packagecom.alatus.mall.ware.service.impl;importcom.alatus.common.to.mq.StockDetailTo;importcom.alatus.common.to.mq.StockLockedTo;importcom.alatus.common.utils.R;importcom.alatus.common.exception.NoStockException;importcom.alatus.mall.ware.conf......
  • Shell编程语法之变量、常量
    Shell的变量、常量变量变量就是程序运行过程中其值可以发生改变的量变量的命名规范应该见名知意,同时遵循如下规则以字母或下划线开头,剩下的部分可以是:字母、数字、下划线最好遵循下述规范:以字母开头使用中划线或者下划线做单词的连接high_student同类型的用数字......
  • C++编程-使用树莓派Pico制作调光灯:电位器与LED亮度控制的C++实现
    在嵌入式系统中,电位器是一种简单而实用的元件,用于调节电压和模拟信号。在本项目中,我们将结合树莓派Pico,利用电位器控制LED的亮度,制作一个简单的调光灯。这不仅是一个有趣的硬件控制项目,也是学习C++编程与模拟信号处理的绝佳机会。一、项目介绍电位器是一种可调电阻,通过旋转......
  • HZCU 2024软件工程|第八组 智能编程测评系统
    一、背景随着编程技术的不断普及,越来越多的编程爱好者加入到软件开发的行列中。然而,编程本身的复杂性和高门槛,尤其是对于缺乏系统学习经验的编程爱好者来说,往往成为他们在学习和实践过程中面临的主要挑战。在这样的背景下,智能编程系统应运而生,旨在为编程爱好者提供一个测评平台,帮......
  • 【数据结构】栈和队列
    栈和队列1.栈(Stack)1.1概念1.2栈的使用1.3栈的模拟实现1.4栈的应用场景1.改变元素的序列2.将递归转化为循环3.[括号匹配](https://leetcode.cn/problems/valid-parentheses/description/)4.[逆波兰表达式求值](https://leetcode.cn/problems/evaluate-reverse-po......
  • nodejs bull 实现延时队列
    nodejsbull实现延时队列 bull.jsconstQueue=require('bull');constqueue=newQueue('nike',{redis:{port:6379,host:'127.0.0.1',db:3,password:null},prefix:'nike_',defaultJobO......
  • 【C 语言篇】函数模块拼图与代码复用灯塔:C 语言编程中探索函数调用的高效征程
    文章目录【C语言篇】函数模块拼图与代码复用灯塔:C语言编程中探索函数调用的高效征程前言一、创建和使用函数1.创建函数2.调用函数二、局部变量1.局部变量的特点2.局部变量的初始化3.局部变量的生命周期4.关于局部变量的总结三、全局变量1.全局变量的特点2......
  • 【队列习题】如果允许在循环队列的两端都可以进行插入和删除操作,要求:写出循环队列的类
    题目如果允许在循环队列的两端都可以进行插入和删除操作,要求:写出循环队列的类型定义。分别写出从队尾删除和从队头插入的算法。分析本题实际上是求双端队列的操作约束队头指针指向队头元素的上一个位置队尾指针指向队尾元素1.双端队列的存储结构跟队列的存储结构相......
  • 链式队列的实现及其应用
    目录一、概念二、链式队列的结构模型三、链式队列的实现3.1创建3.2入队3.3出队3.4判断是否为空3.5释放队列3.6清空队列四、应用一、概念链式队列,顾名思义,是基于链表实现的不同于普通链表,它在一端插入,另一端删除而由于链表中特殊的存在(头结点、尾结点),正好可以用......
  • 4、分析与设计工具(一)软件功能设计 - 编程实战工具系列文章
    四、软件功能设计工具四.一、软件功能设计 这次介绍软件功能设计工具,使用的是EnterpriseArchitect的UML设计软件。       1、EnterpriseArchitect下载:      EnterpriseArchitect16.1中文版的安装包和无限试用应用-工具软件      ......