栈和队列的基本性质

栈是先进后出的结构(弹夹)

队列是先进先出的(排队)

栈和队列在实现结构上可以有数组和链表两种方式

栈结构的基本操作:

1、弹栈

2、访问栈顶元素

3、压栈操作

4、返回当前栈中的元素个数

队列结构的基本操作:

1、队列元素进队列是从队尾插入的

2、队列元素出队列是从对头弹出的             (类似于日常排队)

/*栈的结构定义(顺序栈)*/

#define MAXSIZE 100

typedef int ElemType; /*视栈中要存放的具体元素类型而定*/

typedef int Status;

typedef struct

{

ElemType data[MAXSIZE]; //利用系统的栈来存放栈元素

int top;

}Stack;

typedef struct

{

ElemType *base; //利用堆来存放栈的元素

ElemType *top; //栈顶指针和栈底指针

int count; //栈的大小

}Stack1;

/*栈的初始化*/

Status InitStack(Stack *s)

{

if(s == NULL)

{

return -1;

}

s->top = -1; //初始化栈顶指针

return 0;

}

#define NUM 10

Status InitStack(Stack1 *s1)

{

if(s1 == NULL)

{

return -1;

}

s1->top = (ElemType *)malloc(sizeof(ElemType)*NUM); //初始化栈顶指针

if(NULL == s1->top)

{

return -1; //申请内存失败

}

s1->base = s1->top;

s1->count = 0;

return 0;

}

/*压栈*/

Status push(Stack *s, ElemType e)

{

if(s->top == MAXSIZE-1)

{

//栈满

return -1;

}

s->top++;

s->data[s->top] = e;

return 0;

}

Status push(Stack1 *s1, ElemType e)

{

if(s1->top == s1->base+NUM-1)

{

//栈满

return -1;

}

*(s1->top) = e;

s1->top++;

s1->count++;

return 0;

}

/*出栈*/

Status pop(Stack *s, ElemType *e)

{

if(s->top == -1)

{

//栈空

return -1;

}

*e = s->data[s->top];

s->top--;

return 0;

}

Status pop(Stack1*s1, ElemType *e)

{

if(s1->top == s1->base)

{

//栈空

return -1;

}

*e = *(s1->top);

s1->top--;

s->count--;

return 0;

}

/*链式栈*/

/*栈元素的(节点的结构)和栈结构的定义*/

typedef int ElemType;

typedef int Status;

/*结点的结构*/

typedef struct node

{

ElemType data;

struct node *next;

}Node;

/*栈的结构*/

typedef struct

{

struct node *top; //栈顶指针

int count; //用来记录栈元素的个数

}Stack;

/*链栈初始化*/

Status InitStack(Stack *s)

{

if(NULL == s)

{

return -1;

}

s->top = NULL; //栈空,栈顶指针指向NULL

s->count = 0;

return 0;

}

/*把链表的头指针当作栈的栈顶指针,链表的尾结点当作栈底*/

/*栈元素只在栈顶进栈或者出栈*/

/*压栈*/

Status push(Stack *s, ElemType e)

{

if(NULL == s)

{

return -1;

}

Node *p = (Node *)malloc(sizeof(Node)); //申请一个节点

if(NULL == p)

{

return -1;

}

p->data = e;

p->next = s->top; //令新创建的节点指向当前的栈顶

s->top = p; //栈顶指针指向新压栈的元素

s->count++;

return 0;

}

/*出栈*/

Status pop(Stack *s, ElemType *e)

{

if(NULL==s || NULL==s->top)

{

return -1;

}

*e = s->top->data; //取出栈顶元素的值

Node *temp = s->top; //保存当前要出栈的栈顶元素的地址

s->top = s->top->next; //将栈顶指针移向下一个元素

s->count--;

free(temp); //释放当前栈顶元素的指针

return 0;

}

/*循环队列(顺序结构)*/

#define MAXSIZE 10 //队列的大小

typedef int ElemType;

typedef int Status;

/*顺序队列结构*/

typedef struct

{

ElemType data[MAXSIZE]; //利用系统的栈来存放队列的元素

int front; //队头(出队)

int rear; //队尾(进队)

}Queue;

/*队列的初始化*/

Status InitQueue(Queue *q)

{

if(NULL == q)

{

return -1;

}

q->rear = 0;

q->front = 0;

return 1;

}

/*返回循环队列的元素个数*/

int NumQueue(Queue *q)

{

return (q->rear-q->front+MAXSIZE)%MAXSIZE;

}

/*进队列(从队尾进队)*/

Status EnQueue(Queue *q, ElemType e)

{

if(NULL==q || (q->rear+1)%MAXSIZE==q->front)

{

return -1;

}

q->data[q->rear] = e;

q->rear = (q->rear+1) % MAXSIZE;

return 0;

}

/*出队列(从队头出队)*/

Status OutQueue(Queue *q, ElemType *e)

{

if(q==NULL || q->rear==q->front)

{

return -1;

}

*e = q->data[q->front];

q->front = (q->front+1) % MAXSIZE;

return 0;

}

/*用链表实现队列*/

/*队列元素的结点结构和队列结构*/

/*队列存储的元素的类型*/

typedef int ElemType;

typedef int Status;

/*结点结构*/

typedef struct node

{

ElemType data;

struct node *next;

}Node;

/*队列结构(一个队头指针,一个队尾指针)*/

typedef struct

{

struct node *front;

struct node *rear;

}Queue;

/*链式队列的初始化*/

/*无头结点*/

Status InitQueue(Queue *q)

{

if(NULL == q)

{

return -1;

}

q->front = NULL;

q->rear = NULL;

return 0;

}

/*有头结点*/

Status InitQueue(Queue *q)

{

if(NULL == q)

{

return -1;

}

/*创建一个头结点*/

Node *p = (Node *)malloc(sizeof(Node));

if(NULL == p)

{

return -1;

}

/*初始化头结点和队头队尾指针*/

p->next = NULL;

q->front = p;

q->rear = p;

return 0;

}

/*元素进队列*/

Status EnQueue(Queue *q, ElemType e)

{

if(NULLL == q)

{

return -1;

}

Node *temp = (Node *)malloc(sizeof(Node));

if(NULL == temp)

{

//申请内存失败

return -1;

}

/*初始化新插入的节点*/

temp->next = NULL;

temp->data = e;

/*从队尾连接新插入的节点并把队尾指针指向新插入的节点*/

q->rear->next = temp;

q->rear = temp;

return 0;

}

/*元素出队列*/

/*无头结点版本,从队头出队*/

Statu OutQueue(Queue *q, ElemType *e)

{

if(NULL == q || (NULL==q->rear))

{

return -1;

}

if(q->front == q->rear)

{

/*如果大家都指向同一个节点证明队列只有一个元素,那么q->rear也应该要改变*/

free(q->front);

q->front = NULL;

q->rear = NULL;

return 0;

}

Node *temp = q->front;

*e = q->front->data;

q->front = q->front->next;

free(temp);

return 0;

}

/*有头结点版本*/

Status OutQueue(Queue *q, ElemType *e)

{

if(NULL==q || (q->rear==q->front))

{

return -1;

}

Node *temp = q->front->next;

if(q->front->next == q->rear)

{

q->rear = q->front;

}

q->front->next = temp->next;

*e = temp->data;

free(temp);

return 0;

}

/*计算队列元素的数量*/

/*无头结点*/

int NumQueue(Queue *q)

{

if(NULL == q)

{

return -1;

}

int count = 1;

Node *temp1 = q->front;

Node *temp2 = q->rear;

if(temp1==NULL && temp2==NULL)

{

return 0;

}

else if(temp1 == temp2)

{

return count;

}

while(temp1 != temp2)

{

count++;

temp1 = temp1->next;;

}

return count;

}

是栈还是队列c语言实验报告怎么写,队列和栈(C语言)相关推荐

  1. 华北水利水电大学2012级c语言实验报告,华北水利水电大学2012级c语言实验报告(5)...

    1.华北水院高级语言程序设计(C语言)实验报告(五)2012-2013学年 第二学期2012级 专业: 学号: 姓名: 一.实验题目:函数二.实验目的:(略)三.实验内容1. 程序验证(略)2程序设计 ...

  2. c语言实验报告第四章答案,理工大学2010C语言实验报告参考答案

    理工大学2010C语言实验报告参考答案 2010C语言实验报告参考答案 实验一 熟悉C语言程序开发环境及数据描述 四.程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is lon ...

  3. lr1分析器c语言实验报告怎么写,编译原理课程的设计构造LR分析法语法分析器.doc...

    编译原理课程的设计构造LR分析法语法分析器 太 原 学 院 课程设计报告书 课程名称 设计题目 构造LR(0)分析法语法分析器 专业班级 学 号 姓 名 指导教师 2016年 12 月 15日 目 录 ...

  4. C语言上机报告例文,c语言上机实验报告_大一c语言上机实验报告_c语言实验报告怎么写...

    计算机的同学会进行上机实验,包括ERP,JA,C语言等等.下面是出国留学网为大家整理的上机实验心得体会,供大家参考. 上机实验心得体会(一) 通过该实验,对所学的知识有了进一步的了解.在实验的过程中, ...

  5. 哈工大威海c语言实验报告 第八章 无法运行程序,哈工大威海c语言实验报告.doc...

    哈工大威海c语言实验报告 PAGE PAGE 25 哈工大威海c语言实验报告篇一:C语言实验报告2至4章实验2(1)#includemain(){int s=1,n;scanf("%d&qu ...

  6. 华北水利水电大学c语言实验报告八2020,2021年华北水利水电大学级C语言实验报告.doc...

    2021年华北水利水电大学级C语言实验报告 华北水院高级语言程序设计(C语言)试验汇报(五) -- 第二学期 级 专业: 学号: 姓名: ------------------------------- ...

  7. c语言实验报告实验要求,c语言实验报告格式要求.doc

    c语言实验报告格式要求.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档 ...

  8. c语言实验报告管理系统,C语言实验报告-学生信息资管理系统.doc

    C语言实验报告-学生信息资管理系统 C语言实验报告 院系: 数学与计算科学学院 班级: 信息与计算科学2班 姓名: 学号: 2011年12月21日 一.问题描述 编写一个信息管理系统,包括姓名.性别. ...

  9. 周信东c语言实验二实验报告,周信东主编最新版C语言程序设计基础实验一实验报告.doc...

    周信东主编最新版C语言程序设计基础实验一实验报告.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我 ...

最新文章

  1. 只需 9.9 元!前 Facebook 工程师 7 天带你掌握 7 大数据结构,大厂面试必备!
  2. docker 嵌套技术 docker outside of docker 可用于一个容器内调用另一个容器内程序 跨容器调用 docker容器内获取自身容器信息
  3. ubuntu字符界面login_Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法...
  4. 如何为Oracle配置多个监听器
  5. 给 ListBox 的 DataTemplate 模板中的 元素设置动画
  6. 基于主特征空间相似度计算的切分算法及切分框架
  7. leecode第二百一十七题(存在重复元素)
  8. 一个类windows系统的效果图
  9. 真人发音计算机在线用,文字转语音真人发声在线怎么转换?这种操作最简单
  10. 数据外推算法 c语言,[原创]如何进行内插法和外推法的计算
  11. SAP中内部订单状态对结算的影响分析测试
  12. 安装mantis 2.14
  13. 【004】VS2017配置OpenCV4.1.0
  14. 微信小程序注册提示邮箱已被占用
  15. Ubuntu16.04安装steam
  16. 微信小程序支付绑定商户号问题
  17. 程序员应如何提高系统分析能力(转)
  18. 记一次python考试题
  19. X书x-mini-sig_x-mini-mua
  20. appinventor飞机大战案例_APPInventor实例及讲解

热门文章

  1. PHP抽象类abstract关键字
  2. SQL中left join、right join、inner join的区别
  3. python os模块方法_python os模块的常用方法
  4. python列表生成多个号码_python按需生成固定数量电话号码并保存为excel(不重复)...
  5. ds18b20温度转换指令_【Proteus】DS18B20简易温控器
  6. mysql查询建表SQL语句
  7. java序列化如何实现_Java实现序列化与反序列化的简单示例
  8. webspere php,Project Zero、WebSphere sMash、PHP和JAVA的整合
  9. html 保存xlsx,HTML SaveXLSX按钮防止将数据保存到SlickGrid的XLSX文件中
  10. 安装深度linux无法引导,安装deepin无法引导,求教!