• 若希望循环队列中的元素都得到利用,则需要设置一个标志域tag,并且以tag的值为0或1来区分队头指针front和队尾指针rear相同的队列状态是“空”还是“满”
#ifndef T1_H
#define T1_H#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>#define MaxSize 10//定义栈中元素的最大个数typedef int ElemType;
typedef struct{ElemType data[MaxSize];int front,rear;//front指向队头元素,rear指向队尾的下一个位置(也就是下一个应该插入的位置int tag;//0表示出队操作,1表示入队操作,只有在指针相同且是出队操作才表示空,在指针相同的入队操作表示满
}SqQueue;void InitSqQueue(SqQueue *Q);//初始化
bool EnSqQueue(SqQueue *Q,ElemType x);//入队操作
bool DeSqQueue(SqQueue *Q,ElemType *x);//出队操作#endif
#include "t1.h"void InitSqQueue(SqQueue *Q){(*Q).rear=(*Q).front=0;(*Q).tag=0;
}
bool EnSqQueue(SqQueue *Q,ElemType x){if((*Q).rear==(*Q).front&&(*Q).tag==1)//队列满return false;(*Q).data[(*Q).rear]=x;(*Q).rear=((*Q).rear+1)%MaxSize;(*Q).tag=1;return true;
}
bool DeSqQueue(SqQueue *Q,ElemType *x){if((*Q).rear==(*Q).front&&(*Q).tag==0)//队空return false;(*Q).tag=0;*x=(*Q).data[(*Q).front];(*Q).front=((*Q).front+1)%MaxSize;return true;
}
void printfSqQueue(SqQueue Q){if(Q.rear==Q.front&&Q.tag==0)return;do{printf("%d<-",Q.data[Q.front]);Q.tag=0;Q.front=(Q.front+1)%MaxSize;}while(Q.rear!=Q.front&&Q.tag==0);printf("\n");
}
void test1(){SqQueue Q;InitSqQueue(&Q);ElemType x=0;scanf("%d",&x);while(x!=999){EnSqQueue(&Q,x);scanf("%d",&x);}// printf("%d-%d\n",Q.front,Q.rear);printfSqQueue(Q);DeSqQueue(&Q,&x);printfSqQueue(Q);
}
void main(){test1();
}
  • 假设一个算数表达式中包括圆括号,方括号和花括号三种类型的括号,编写一个算法来判别表达式中的括号是都匹配,以字符"\0"作为算数表达式的结束符

思路:遇到左括号入栈
遇到有括号,出栈匹配,同一类型括号且左右括号匹配成功,其他失败
全部匹配成功且栈为空,匹配成功

#ifndef LISTACK_H
#define LISTACK_H
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
// 链栈,不带头结点的情况
typedef char ElemType;
typedef struct LinkNode{ElemType data;//数据域struct LinkNode *next;//这里的定义是有问题的,在栈中应该设计一个top指针,但是考虑到手比脑快代码都写完了就不改了,介意的话把next改名为top就可以了
}LinkNode,*LinkStack;bool InitStack4(LinkStack *s);//初始化不带头结点的栈
bool Push4(LinkStack *s,ElemType x);//入栈
bool Pop4(LinkStack *s,ElemType *x);//出栈
void printfStack4(LinkStack s);//打印
bool EmptyStack4(LinkStack s);//空栈
#endif
#include "listack.h"bool InitStack4(LinkStack *s){*s=NULL;//栈空,不带头结点return true;
}
bool EmptyStack4(LinkStack s){if(s==NULL){return true;}return false;
}
bool Push4(LinkStack *s,ElemType x){LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));if(p==NULL)return false;p->data=x;// 这一步很容易错p->next=(*s);(*s)=p;return true;
}
bool Pop4(LinkStack *s,ElemType *x){if((*s)==NULL)//空表return false;LinkNode *p=*s;*s=(*s)->next;*x=p->data;free(p);return true;
}
void printfStack4(LinkStack s){// s=NULL;LinkNode *p=s;while(p!=NULL){printf("%c->",p->data);p=p->next;}printf("\n");
}
// void test4(){//     LinkStack s;
//     InitStack4(&s);
//     // printfStack4(s);
//     Push4(&s,1);
//     Push4(&s,2);
//     printfStack4(s);
//     ElemType x=0;
//     Pop4(&s,&x);
//     printfStack4(s);// }
// void main(){//     test4();
// }
#include "listack.h"
// 假设字符串中只有三种括号 {} [] ()
bool ifMatch(char c[],int len){if(len==0)return true;LinkStack s;InitStack4(&s);for(int i=0;i<len;i++){if(c[i]=='{'||c[i]=='('||c[i]=='['){//左括号入栈Push4(&s,c[i]);}else if(c[i]=='}'||c[i]==')'||c[i]==']'){if(EmptyStack4(s))//如果是右括号需要被匹配但是栈空,直接返回falsereturn false;char temp=' ';Pop4(&s,&temp);if(c[i]=='}'&&temp!='{')return false;else if(c[i]==']'&&temp!='[')return false;else if(c[i]==')'&&temp!='(')return false;   }}if(!EmptyStack4(s))//所有都正常匹配,但是左括号还有多余的return false;return true;}
  • 车厢调度,两个铁道之间都是单向行驶道,火车调度站有一个用于调度的“栈道”,火车调度站的入口有n节硬座和软座车厢,(分别用H和S表示)等待调度,编写算法,输出对这n节车厢进行调度的操作序列,使得所有软座车厢都被调整到硬车厢之前。
    体会数组和指针之间的联系
#include "t2.h"// 函数声明
bool InitStack4(LinkStack *s);//初始化不带头结点的栈
bool Push4(LinkStack *s,ElemType x);//入栈
bool Pop4(LinkStack *s,ElemType *x);//出栈
void printfStack4(LinkStack s);//打印
bool EmptyStack4(LinkStack s);//空栈void train(char *train){char *p=train,*q=train,c=' ';LinkStack s;InitStack4(&s);while(*p){if(*p=='H')Push4(&s,*p);else*(q++)=*p;p++;}while(!EmptyStack4(s)){Pop4(&s,&c);*(q++)=c;}
}
void test2(){char c[]="HHHHSSSSSHSHSHSH";train(c);int index=0;while(c[index]!='\0'){printf("%c",c[index++]);}
}
void main(){test2();
}
bool InitStack4(LinkStack *s){*s=NULL;//栈空,不带头结点return true;
}
bool EmptyStack4(LinkStack s){if(s==NULL){return true;}return false;
}
bool Push4(LinkStack *s,ElemType x){LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));if(p==NULL)return false;p->data=x;// 这一步很容易错p->next=(*s);(*s)=p;return true;
}
bool Pop4(LinkStack *s,ElemType *x){if((*s)==NULL)//空表return false;LinkNode *p=*s;*s=(*s)->next;*x=p->data;free(p);return true;
}
void printfStack4(LinkStack s){// s=NULL;LinkNode *p=s;while(p!=NULL){printf("%c->",p->data);p=p->next;}printf("\n");
}
// void test4(){//     LinkStack s;
//     InitStack4(&s);
//     // printfStack4(s);
//     Push4(&s,'1');
//     Push4(&s,'2');
//     printfStack4(s);
//     ElemType x=0;
//     Pop4(&s,&x);
//     printfStack4(s);// }
// void main(){//     test4();
// }
  • 某汽车轮渡口,过江渡船每次能载10辆车过江,过江车辆分为客车类和货车类,上渡船有如下规定:同类车先上船,客车先于货车上船,且每上4辆客车才允许上一辆货车,若等待的客车不足4辆,则以或车代替,若无货车等待,允许客车都上船。使设计算法模拟以上渡口管理。

思路:这里设计一种最大长度为10的队列,用Q存储要过车的顺序,QH表示货车的队列,QK表示客车队列,每次对过车的车辆先分类,对于客车,每4辆客车加一辆货车,然后对应balance标志位置0,客车空或者货车空就可把剩下的另一种类型车全部入Q队列,这里值得注意的是,因为设计的队列长度为10,所以对于大于10的车辆不会入队列。

#ifndef T1_H
#define T1_H#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>#define MaxSize 10//定义栈中元素的最大个数typedef char ElemType;
typedef struct{ElemType data[MaxSize];int front,rear;//front指向队头元素,rear指向队尾的下一个位置(也就是下一个应该插入的位置int tag;//0表示出队操作,1表示入队操作,只有在指针相同且是出队操作才表示空,在指针相同的入队操作表示满
}SqQueue;void InitSqQueue(SqQueue *Q);//初始化
bool EnSqQueue(SqQueue *Q,ElemType x);//入队操作
bool DeSqQueue(SqQueue *Q,ElemType *x);//出队操作
void printfSqQueue(SqQueue Q);//打印队列
bool EmptySqQueue(SqQueue Q);//判断队列是否为空
bool FullSqQueue(SqQueue Q);//队列是否满
#endif
#include "t1.h"// 若希望循环队列中的元素都得到利用,则需要设置一个标志域tag,并且以tag的值为0或1来区分
// 队头指针front和队尾指针rear相同的队列状态是“空”还是“满”
void InitSqQueue(SqQueue *Q){(*Q).rear=(*Q).front=0;(*Q).tag=0;
}
bool EnSqQueue(SqQueue *Q,ElemType x){if((*Q).rear==(*Q).front&&(*Q).tag==1)//队列满return false;(*Q).data[(*Q).rear]=x;(*Q).rear=((*Q).rear+1)%MaxSize;(*Q).tag=1;return true;
}
bool DeSqQueue(SqQueue *Q,ElemType *x){if((*Q).rear==(*Q).front&&(*Q).tag==0)//队空return false;(*Q).tag=0;*x=(*Q).data[(*Q).front];(*Q).front=((*Q).front+1)%MaxSize;return true;
}
bool EmptySqQueue(SqQueue Q){if(Q.rear==Q.front&&Q.tag==0){return true;}return false;
}
bool FullSqQueue(SqQueue Q){if(Q.rear==Q.front&&Q.tag==1)return true;return false;
}
void printfSqQueue(SqQueue Q){if(Q.rear==Q.front&&Q.tag==0)return;do{printf("%c<-",Q.data[Q.front]);Q.tag=0;Q.front=(Q.front+1)%MaxSize;}while(Q.rear!=Q.front&&Q.tag==0);printf("\n");
}
// void test1(){//     SqQueue Q;
//     InitSqQueue(&Q);//     ElemType x=0;
//     scanf("%d",&x);
//     while(x!=999){//         EnSqQueue(&Q,x);
//         scanf("%d",&x);
//     }
//     // printf("%d-%d\n",Q.front,Q.rear);
//     printfSqQueue(Q);
//     DeSqQueue(&Q,&x);
//     printfSqQueue(Q);
// }
// void main(){//     test1();
// }
#include  "t1.h"// K表示客车,H表示货车,QH用来存暂时还不能上船的货车,QK表示暂时还不能上船的货车,Q表示上船的顺序void boat(char *c){if(*c=='\0')return;SqQueue Q;SqQueue QK;SqQueue QH;int balance=0;//表示当前客车已入船的数量,每4归0char temp=' ';//临时变量InitSqQueue(&Q);InitSqQueue(&QK);InitSqQueue(&QH);while(*c&&!FullSqQueue(QH)&&!FullSqQueue(QK)){//分类,是什么车if(*c=='H'){EnSqQueue(&QH,*c);}else{EnSqQueue(&QK,*c);}c++;}while(!EmptySqQueue(QK)||!EmptySqQueue(QH)){while(balance<4&&!EmptySqQueue(QK)){DeSqQueue(&QK,&temp);EnSqQueue(&Q,temp);balance++;}if(balance==4&&!EmptySqQueue(QH)){DeSqQueue(&QH,&temp);EnSqQueue(&Q,temp);balance=0;}while(EmptySqQueue(QK)&&!EmptySqQueue(QH)){DeSqQueue(&QH,&temp);EnSqQueue(&Q,temp);}while(EmptySqQueue(QH)&&!EmptySqQueue(QK)){DeSqQueue(&QK,&temp);EnSqQueue(&Q,temp);}}printfSqQueue(Q);
}
void test4(){char c[]="HHHHHHHHHHH";boat(c);
}
void main(){test4();
}

数据结构应用题第三章栈和队列代码c相关推荐

  1. 【数据结构】第三章 栈和队列

    1 栈的概念 栈:限定仅在表尾进行插入和删除操作的线性表,后进先出的线性表,简称LIFO结构 栈顶:表尾,允许插入和删除的一端 栈底:表头,不允许插入和删除的一端 空栈:不含任何数据元素的栈 2 栈的 ...

  2. 【算法基础】数据结构导论第三章-栈、队列和数组.pptx

    上课的课件分享,适合教学用. 文末提供下载 已发布: 数据结构导论第一章-绪论 数据结构导论第二章-线性表 本文参考百度文库的多篇文章. 如需下载ppt文件,请回复"sjjg3" ...

  3. (王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀、中缀和后缀)

    前面我们就说过,栈是一种先进后出的线性表,这种先进后出的特性就决定了它在一类场合或问题中会经常被用到--递归.考研数据结构中所涉及的利用栈结构解决递归问题或者考察栈结构特性的问题主要有这么几类 括号匹 ...

  4. 数据结构-第三章-栈和队列(5)-链队

    数据结构 ⚡️数据结构-第一章 ⚡️抽象数据类型案例 ⚡️数据结构-第二章(1)-线性结构 ⚡️数据结构-第二章(2)-线性表的顺序表示和实现 ⚡️数据结构-第二章(3)-顺序表(含代码) ⚡️数据结 ...

  5. C语言数据结构【手抄版】第三章 栈和队列

    注意:文中彩色代码均在Visual Studio 2022编译器中编写,本文为C语言数据结构手抄版,文中有部分改动,非原创. 目录 注意:文中彩色代码均在Visual Studio 2022编译器中编 ...

  6. C语言数据结构-第三章栈和队列-电大同步进度

    第三章栈和队列简介 从数据结构角度看,栈和队列是两种重要的线性结构,是一类操作受限制的特殊线性表,其特殊性在于限制插入和删除等运算的位置. 堆栈,限制用户只能在指定的一端插入和删除元素,因此具有后进先 ...

  7. 王道考研408 数据结构 第三章 栈、队列与数组

    第三章 栈.队列与数组 3.1 栈 3.1.03 假设以I和O分别表示入栈和出栈操作.栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序 ...

  8. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  9. 第三章栈和队列-作业题

    第三章栈和队列-作业题 1.栈和列队的基本概念 6-1 使用栈完成回文判断 (12 分) 6-2 判断表达式中括号是否匹配 (12 分) 6-3 队列的操作集合(带尾指针的循环链表) (18 分) 6 ...

最新文章

  1. 人类大脑神经如何进化?寄生虫充当了隐形设计师
  2. 浅谈ATP CHECK zz
  3. 【spring boot】使用RestTemplate调用百度坐标转换服务
  4. python的一个小原理
  5. python生成器 图片分类_python批量处理图片图片Python迭代器和生成器介绍
  6. Java SSM篇5——SpringMVC
  7. 电脑技术吧_干货!12年技术员从零开始讲电脑硬件之攒机
  8. mysql实现点赞和取消_Redis是如何实现点赞、取消点赞的?
  9. 故宫4天门票已售罄 五一假期大家都去哪儿“看一看”了?
  10. Apache查看并发及TIME_WAIT过多的解决
  11. 互联网十几年 我们错失了哪些创业机会
  12. MODIS植被覆盖度
  13. Badboy下载安装超详细教程
  14. 钢绞线的弹性模量的计算方法_钢绞线弹性模量的理论计算及其影响因素分析
  15. 二项分布期望和方差公式推导
  16. ‘com.cloudera.server.cmf.TrialState‘:Cannot resolve reference to bean ‘entityManagerFactoryBean‘
  17. python数字转英文_GitHub - Ailln/en2an: 快速转化「英文数字」和「阿拉伯数字」
  18. python网络请求_python发送网络请求
  19. 场景化、细分化来袭:从2022深圳时尚家居设计周看家居行业的重塑之路
  20. linux下eclipse的使用,linux下使用eclipse

热门文章

  1. 百度站长平台召开百度之夜会议:打造良性搜索生态
  2. 盛极而衰,互联网体育是伪风口还是真趋势?
  3. 使用exe4j打包Java桌面程序为exe
  4. python数据分析优势-用Python做数据分析有哪些优势?
  5. JVM新生代Eden和survivor区别
  6. 机器学习线性回归实践,波士顿房价预测,手写梯度下降
  7. 【求助】ipad远程桌面下vmware键盘布局错乱
  8. 人间清醒,内容为王 - 技术er究竟该如何写博客?1024上海嘉年华之敖丙演讲观后感。
  9. Docker学习三 Docker安装Mysql
  10. 解决element-ui对话框组件el-dialog遮罩层小问题