火车车厢重排问题,队列,c语言
数据结构课程标准
1 课程标准1.1 课程定位《数据结构》是计算机类专业的核心课程之一,是软件技术专业必修的专业基础课程,也是其它非计算机专业的主要选修课程之一。
数据结构研究的范围和计算机软件有着密切的关系,无论是编译源程序还是操作系统,都涉及到数据元素在存储器中如何分配的问题。
在研究信息检索时也必须考虑如何组织这些数据,以便使查找和存取数据元素更为高效。
因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础。
由于《数据结构》是一门理论性很强的课程,重在理论,而高职教学的主要目标是培养高级技术应用型人才,更加偏重于实践能力的培养,所以我们针对高职学生的特点,在教学过程中对《数据结构》课程进行了系列教学改革,并取得了较好的效果。
本课程以就业为导向,从高技能人才培养的要求出发,以强化技术应用能力培养为主线,构建理论教学体系和实践教学体系。
在教学内容上,按照理论知识够用的高职教育原则,根据学生知识能力、企业岗位能力要求等,弱化了无应用性或应用性不强的内容,强化了工程项目中常用的知识点,构建了必须的教学单元。
1.2 工作任务和课程目标1.2.1 工作任务及职业能力表1-1 工作任务与职业能力分析表1.2.2 课程目标本课程的主要目标是使学生深入了解数据结构的逻辑思想、实现方法和应用技术。
本课程追求理论联系实际,教学与实践相呼应。
灵活多样地采取了编程、拓展性学习、案例教学、讨论、报告,大型作业,科研项目等多种形式,激发学生的学习兴趣和主动参与精神,使学生理解原理,掌握方法,熟练应用,能够创造性地应用各种数据结构和算法设计性能优,效率高,可读性强,易维护的程序,解决实际问题,提高学生的学习能力,探索研究的能力。
根据课程面对的工作任务和职业能力要求,本课程的教学目标为:(1)知识目标1)数据结构的基本概念及算法的评价。
基于Asp .net、XML与Flash架构的火车车厢重排问题虚拟实验开发
基于、XML与Flash架构的火车车厢重排问题虚拟实验开发摘要:当前,XML(Extensible Makeup Language)是跨平台数据结构的最佳选择,应用广泛。
它是一种通用的、跨平台的数据描述方法,相比于一般的记事本文件,完全采用了Unicode 编码和条理清晰的分层标签。
介绍了和Flash之间通过XML文件传递信息解决火车重排堆栈问题。
Flash使抽象的数据结构问题转化为具象的动画呈现给学生,有助于学生理解问题、编写程序。
关键词:XML;;Flash;虚拟实验;火车车厢重排0引言当前,XML是跨平台数据结构的最佳选择。
XML全称为可扩展标记语言(Extensible Makeup Language)。
它是一种通用的、跨平台的数据描述方法,也是未来存储信息的方式,其应用无处不在。
XML是可扩展的、与平台无关的语言,相比于一般记事本文件,它完全采用Unicode 编码和条理清晰的分层标签并且支持国际化。
Flash是专业的动画创作工具,可以开发有吸引力、表现力的用户界面和丰富的应用程序。
它开发的文件数据量小,可以以插件方式工作、“流”形式文件播放以及实时交互。
因此,Flash成功地渗入到网络动画、音乐电视、广告、教学、游戏等多个领域。
是基于通用语言的编译运行程序,其强大的适应性,几乎可以使它运行在Web 应用软件开发者全部的平台上。
通用语言的基本库、消息机制、数据接口的处理都能无缝整合到的Web应用中。
也是languageindependent(语言独立化)的,支持C#(C++和Java的结合体)、VB、Jscript、C++、F++等语言。
与Flash之间传值在中对数据进行处理后,生成XML树,然后通过XML 文件在Flash端接收XML文件,解析XML树后,根据传入的参数进行操作。
<sup>[1]</sup>其通信原理如图1所示。
端生成XML文件的代码如下:System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter (Server.MapPath("./1234.xml"),System.Text.Encoding.UTF8);//声明一个xmlWriter变量用于编写XML文件xmlWriter.Formatting = Formatting.Indented;//用于生成良好的显示格式,增强可读性xmlWriter.WriteStartDocument();xmlWriter.WriteStartElement("数据");//生成一个结点xmlWriter.WriteStartElement("单次");xmlWriter.WriteAttributeString("车厢",firstNum.ToString());//写入节点的属性xmlWriter.WriteAttributeString("铁轨",secondNum.ToString());xmlWriter.WriteAttributeString("出入",thirdNum.ToString());xmlWriter.WriteEndElement();xmlWriter.WriteEndDocument();//写文档结束xmlWriter.Close();//关闭textWriterFlash端接收XML文件的代码如下:var myXML:XML= new XML;var XML_URL:String = "1234.xml";var myXMLURL:URLRequest = new URLRequest(XML_URL);public var myLoader:URLLoader = new URLLoader (myXMLURL);public function Motion(){myLoader.addEventListener("complete",xmlLoaded);}2火车重排堆栈问题动画实现笔者在学习数据结构时发现授课内容比较抽象,需要具体的图解动态地描述问题。
火车车厢重排问题
⽕车车厢重排问题2014-11-04主要数据结构:栈题⽬:⼀列⽕车要将n节车厢分别送往n个车站按1~n的次序编号,⽕车按照n,n-1,…1的编号次序经过车站。
假设车厢的编号就是其⽬的地车站的编号。
要求:给定⼀个任意的车厢排列次序。
重新排列车厢,使其按照从1到n的次序排列。
规定重排时,只能从⼊轨到缓冲铁轨,或者从缓冲铁轨到出轨。
总的思路:⾸先:将所需要重排的车厢编号从左到右依次输⼊数组carrage中;然后:对carrage中的元素进⾏从左往右逐个遍历,如果符合下⼀个输出,则直接将其输出,并且遍历所有的缓冲轨道,查找是否有符合下⼀个输出的车厢,有的话便将其输出,否则将其压⼊缓冲轨道未经优化的代码:1 #include <iostream>2 #include <stack>3using namespace std;45 stack<int> stack_final;678void Output(int& minH, int& minS, stack<int> H[], int k, int n) {9// put the car from the strack to the output line, and change the minH and minS10int index; // the index of the car11//delete the minist car number from the minS12 stack_final.push(H[minS].top());13 H[minS].pop();14 cout << "Move car " << minH << "from holding track " << minS << " to output line" << endl;15//serch all the track's top, find the new minH and minS16 minH = n+2;17for (int i= 0; i < k; i++) {18if (!H[i].empty() && (index = H[i].top()) < minH) {19 minH = index;20 minS = i;21 }22 }23 }2425bool Input(int c, int& minH, int& minS, stack<int> H[], int k, int n) {26// put the new car c into the track27// if there is no available track, then return false, else return true28// find the best track for the car c29// initial30int BestTrack = 0; //the best track now31int BestTop = n+1; //the best track's top car32int index; //the index for the car33// search the k track34for (int i= 0; i < k; i++) {35if (!H[i].empty()) {36 index = H[i].top();37if (c < index && index < BestTop) {38//the top car's number is the smallest39 BestTop = index;40 BestTrack = i;41 }42 } else { // the track is empty43if (!BestTrack) {44 BestTrack = i;45 }46 }47 }48if (!BestTrack) {49return false; //there is available track to use50 }51 H[BestTrack].push(c);52 cout << "Move car " << c << "from input to holding track " << BestTrack << endl;53//if it is essencial, then change the minH and minS54if (c < minH) {55 minH = c;56 minS = BestTrack;57 }58return true;59 }6061bool Railroad(int input[], int n, int k) {62//k63// if it resort succed, then return true, else return false64// create the stack according to the k65 stack<int> *H;66 H = new stack<int> [k];67int NowOut = 1; // the next number of car to putout68int minH = n+1; //the minist number car in the k69int minS; //the minist number's strack70// resort the car71for (int i = n-1; i >= 0; i--) {72int number = input[i];73if (number == NowOut) {74 cout << "Move car " << number << " from the input line to the output line\n";75 stack_final.push(number);76 NowOut++;77while (minH == NowOut) {78 Output (minH, minS, H, k, n);79 NowOut++;80 }81 } else {82int end = 0;83for (int j = i; j > 0; j--) {84if (input[j-1] < input[j]) {85 end = j;86break;87 }88 }89for (int j = end; j <= i; j++) {90if (!Input (input[j], minH, minS, H, k, n)) {91return false;92 }93 }94if (end) {95 i = end;96 }97 }98 }99return true;100 }101102int main() {103int n, *input;104 cin >> n;105 input = new int[n];106for (int i = 0; i < n; i++) {107 cin >> input[i];108 }109if (Railroad(input, n, n-1)) {110 cout << "resort succed!\n";111while (!stack_final.empty()) {112 cout << stack_final.top() << "";113 stack_final.pop();114 }115 } else {116 cout << "failed\n";117 }118 }View Code经过优化之后的代码:增加的条件:车厢可以从排在后⾯的缓冲轨道移到前⾯的缓冲轨道。
队列
9/10/2012
35
火车车厢重排-约束
1. 2. 3.
仅允许以下移动: 入轨右端->缓冲铁轨 入轨右端->出轨 缓冲铁轨右端->出轨
9/10/2012
36
火车车厢重排方案
从前至后依次检查入轨上的所有车厢。 如果正在检查的车厢就是下一个满足排列要 求的车厢,可以直接把它放到出轨上去。如 果不是,则把它移动到缓冲铁轨上,直到按 输出次序要求轮到它时才将它放到出轨上。 重排演示。
9/10/2012
17
公式化类Queue
template<class T> T Queue<T>::First() const {// 返回队列的第一个元素 // 如果队列为空,则引发异常OutOfBounds if (IsEmpty()) throw OutOfBounds(); return queue[(front + 1) % MaxSize]; }
9/10/2012
30
返回队列的最后一个元素
template<class T> T LinkedQueue<T>::Last() const {// 返回队列的最后一个元素 // 如果队列为空,则引发异常O u t O f B o u n d s if (IsEmpty()) throw OutOfBounds(); return rear->data; }
9/10/2012
19
公式化类Queue
template<class T> Queue<T>& Queue<T>::Add(const T& x) {// 把x 添加到队列的尾部 // 如果队列满,则引发异常NoMem if (IsFull()) throw NoMem(); rear = (rear + 1) % MaxSize; queue[rear] = x; return *this; }
火车调度c语言程序实现代码
火车调度c语言程序实现代码(总3页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March#define MAXSIZE 100/* 栈、队列的最大容量,设为100 */#include <>#include <>typedef char datatype;typedef struct {datatype stack[MAXSIZE]; /* 装载栈的向量 */int top; /* 栈顶指针 */} seqstack; /* 顺序栈类型定义*/typedef struct{ datatype queue[MAXSIZE];/* MAXSIZE为队列的最大长度 */int front;int rear;} sequeue; /* 顺序队列类型定义*/void setstacknull(seqstack *s ) /* 置空栈 */{ s->top=-1; }datatype pop(seqstack *s ) /* 出栈 */{ if (s->top<0 ){ printf( "stack empty!\n" );return('\0');}else{ s->top--; /* 产生新栈顶指针 */return(s->stack[s->top+1]); /* 返回原栈顶元素值 */ }}int empty(seqstack *s) /* 判断是否为空栈 */{if (s->top<0 ) return(1);else return(0);}void push(seqstack *s,datatype x) /* 入栈 */{ if ( s->top>=MAXSIZE-1 ) /* 上溢 */printf( "stack overflow!\n" );else{ s->top=s->top+1; /* 1.栈顶指针加1 */s->stack[s->top]=x; /* 2.新元素入栈 */}}void setseqnull(sequeue *sq) /* 置空队列 */{sq->front=-1; sq->rear=-1; }void encyque(sequeue *sq,datatype x) /* 入队 */ {if((sq->rear+1)%MAXSIZE==sq->front)printf( "queue overflow!\n" );else{ sq->rear=(sq->rear+1)%MAXSIZE;sq->queue[sq->rear]=x;}}datatype delcyque(sequeue *sq) /* 出队 */{if(sq->front==sq->rear)return(NULL);else{ sq->front=(sq->front+1)%MAXSIZE;return(sq->queue[sq->front]);}}main( ){seqstack *st;sequeue *trainsq;char ch, trains[MAXSIZE],*p=trains;st=(seqstack *)malloc(sizeof(seqstack));trainsq=(sequeue *)malloc(sizeof(sequeue));setstacknull(st);setseqnull(trainsq);printf("enter train serious:\n");gets(trains);putchar('\n');ch=*p;while (ch!='\0'){ ch=*p;if (ch=='L'){ push(st,ch);ch=pop(st);encyque(trainsq,ch);}else{push(st,ch);}p=p+1;}int i=0;p=trains;while(!empty(st)) {ch=pop(st); if(ch=='Q')encyque(trainsq,ch);else{*p=ch;p++;i++;}}if(i>=0){ch=trains[i];push(st,ch);ch=pop(st);encyque(trainsq,ch);i--;}printf("new train serious:\n");while (ch=delcyque(trainsq)) putchar(ch); putchar('\n');}。
c语言队列数据结构
c语言队列数据结构队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。
在C语言中,我们可以使用数组或链表来实现队列数据结构。
本文将介绍C语言中队列的实现方法及其应用。
一、数组实现队列数组是一种简单且常用的数据结构,可以用来实现队列。
在C语言中,我们可以使用数组来创建一个固定大小的队列。
下面是一个使用数组实现队列的示例代码:```c#include <stdio.h>#define MAX_SIZE 100int queue[MAX_SIZE];int front = -1;int rear = -1;void enqueue(int data) {if (rear == MAX_SIZE - 1) {printf("队列已满,无法插入元素。
\n");return;}if (front == -1) {front = 0;}rear++;queue[rear] = data;}void dequeue() {if (front == -1 || front > rear) {printf("队列为空,无法删除元素。
\n"); return;}front++;}int getFront() {if (front == -1 || front > rear) {printf("队列为空。
\n");return -1;}return queue[front];}int isEmpty() {if (front == -1 || front > rear) {return 1;}return 0;}int main() {enqueue(1);enqueue(2);enqueue(3);printf("队列的第一个元素:%d\n", getFront());dequeue();printf("队列的第一个元素:%d\n", getFront());return 0;}```在上述代码中,我们使用了一个数组`queue`来存储队列的元素。
火车调度C++代码
#include<iostream>#include<stack>using namespace std;int main() {int n,i,j,k=0,num;bool hold=false;cin>>n;//输入要调节的火车车厢的个数stack<int> *a = new stack<int> [n-1];//定义n-1个缓冲轨cin>>num;cout<<"the "<<num<<" carriage drives into the 1 rail"<<endl;a[k].push(num);for(i=0;i<n-1;++i){//读取车厢号cin>>num;for(j=0;j<=k;++j) {if(num<a[j].top()) {//如果输入的车厢号比这个缓冲轨的顶部元素小的话,则压入缓冲轨中a[j].push(num);cout<<"the "<<num<<" carriage drives into the "<<j+1<<" rail"<<endl;break;}if(j==k&&k==n-2){//如果缓冲轨被用了n-1个,还差一个不能驶入其中的话,说明其输入为hold=true; //顺序的1到n,记录为true.break;}if(j==k) {//如果该车厢号不能压入原先的k个缓冲轨中,则压入新的缓冲轨中,并记录使用a[k+1].push(num);//缓冲轨的个数k。
cout<<"the "<<num<<" carriage drives into the "<<k+2<<" rail"<<endl;++k;break;}}}if(hold==true) {//如果是确认了输入为顺序的1到n,则按照如下方式输出for(i=0;i<n-1;++i){//cout<<a[i].top()<<" ";cout<<"the "<<a[i].top()<<" carriage drives out from the "<<i+1<<" rail"<<endl;a[i].pop();}//cout<<num;//输出最后一个没能入缓冲轨的车厢cout<<"the last carriage "<<num<<" was not drove into the rail and it is out"<<endl;}else {//如果不是顺序期望输入,则按照如下方式输出for(i=1;i<=n;++i)for(j=0;j<=k;++j){if(a[j].empty()==false&&a[j].top()==i) {//在各个缓冲轨中寻找并输出期望车厢号//cout<<a[j].top()<<" ";cout<<"the "<<a[j].top()<<" carriage drives out from the "<<j+1<<" rail"<<endl;a[j].pop();//输出车厢号后弹出缓冲轨break;}}}return 0;}。
火车车厢重排问题栈c语言
火车车厢重排问题栈c语言以下是一个用C语言实现火车车厢重排问题的代码:```c#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100typedef struct {int val;struct Node* next;} Node;typedef struct {Node* top;} Stack;Stack* createStack() {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->top = NULL;return stack;}int isEmpty(Stack* stack) {return (stack->top == NULL);}void push(Stack* stack, int val) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->val = val;newNode->next = stack->top;stack->top = newNode;}int pop(Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty.\n");return -1;}int val = stack->top->val;Node* temp = stack->top;stack->top = stack->top->next;free(temp);return val;}int peek(Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty.\n");return -1;}return stack->top->val;}int canReorder(int numCars, int cars[]) { Stack* stationStack = createStack(); Stack* branchStack = createStack(); int nextCar = 1;for (int i = 0; i < numCars; i++) {// 如果当前车厢和需要出站的车厢一致,直接出站if (cars[i] == nextCar) {nextCar++;continue;}// 将从站台出来的车厢压入分支轨道while (!isEmpty(stationStack) && peek(stationStack) == nextCar) {push(branchStack, pop(stationStack));nextCar++;}// 当前车厢进站push(stationStack, cars[i]);}// 如果分支轨道中的车厢可以按顺序出站,则返回1,否则返回0while (!isEmpty(branchStack)) {if (pop(branchStack) != nextCar) {return 0;}nextCar++;}return 1;}int main() {int numCars;int cars[MAX_SIZE];printf("Enter the number of train cars: ");scanf("%d", &numCars);printf("Enter the train car numbers: ");for (int i = 0; i < numCars; i++) {scanf("%d", &cars[i]);}int result = canReorder(numCars, cars);if (result) {printf("Yes, it is possible to reorder the train cars.\n"); } else {printf("No, it is not possible to reorder the train cars.\n"); }return 0;}```输入示例:```Enter the number of train cars: 5Enter the train car numbers: 3 1 2 4 5```输出示例:```Yes, it is possible to reorder the train cars. ```。
车厢重组(信息学奥赛一本通-T1310)
【题目描述】
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。
一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。
于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。
他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
【输入】
有两行数据,第一行是车厢总数N(不大于10000),第二行是N个不同的数表示初始的车厢顺序。
【输出】
一个数据,是最少的旋转次数。
【输入样例】
4
4 3 2 1
【输出样例】
6
【源程序】
#include<iostream>
using namespace std;
int a[10100];
int main()
{
int n;
int i,j;
int temp,sum=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
sum++;
}
cout<<sum<<endl;
return 0;
}。
火车车厢重排问题,队列,c语言复习课程
计算机科学与工程学院
《算法与数据结构》试验报告[一]
专业班级 10级计算机工程
02
试验地点 计算机大楼计工教研室
学生学号 1005080222 指导教师 蔡琼 学生姓名 肖宇博
试验时间
2012-4-21
试验项目 算法与数据结构
试验类别
基础性() 设计性() 综合性(√) 其它( ) 试验目的及要求
(1)掌握队列的特点及其存储方法; (2)掌握队列的常见算法和程序实现。
成 绩 评 定 表
类 别 评 分 标 准 分值 得分 合 计
上机表现
积极出勤、遵守纪律 主动完成设计任务 30分
程序与报告
程序代码规范、功能正确 报告详实完整、体现收获
70分
goto label2;
}
else if(r!=0)
{
printf("重排前的序列为\n");
for(i=1;i<=k;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
printf("排列后的车厢号为:\n");
reset(q,w1,w2,k);
}
else
{
printf("我也不知道错哪了?'");
}
}
四、测试用例(尽量覆盖所有分支)
1.输入正确的序列后得到结果如图:
2.倒输这几个数如图:
3.顺序输这个序列
4.如果输入的车厢数有误的时候(为负数或零)
5.如果输入的序列不是连续自然数。
斯德哥尔摩火车上的题c语言
斯德哥尔摩火车上的题c语言在斯德哥尔摩火车上的一天,我发现了一道有趣的C语言题目。
这个题目涉及到C语言中的数据类型和运算符。
让我们一起来解决这个题目吧!题目描述:给定一个整数变量x的初始值为5,用C语言编写程序进行以下操作:1. 将x的值加5,并将结果赋给y。
2. 用y的值乘以2,结果保存到x中。
3. 将x的值减去10,并将结果保存到z。
4. 将z的值除以2,结果保存到x中。
5. 最后,打印x的值。
解决方案:首先,我们定义三个整数变量x、y和z,初始值分别为5,0和0。
```cint x = 5;int y = 0;int z = 0;```接下来,我们按照题目描述的步骤进行操作。
首先,将x的值加5,并将结果赋给y:```cy = x + 5;```然后,用y的值乘以2,结果保存到x中:```cx = y * 2;```接下来,将x的值减去10,并将结果保存到z:```cz = x - 10;```然后,将z的值除以2,结果保存到x中:```cx = z / 2;```最后,打印x的值:```cprintf("%d", x);```至此,我们完成了这道题目的解答。
这个题目测试了我们对C语言中数据类型和运算符的掌握。
通过这道题目,我们复习了整数变量的定义和赋值,以及加减乘除等基本运算符的使用。
同时,我们也巩固了对变量在程序中的作用和流程控制的理解。
在C语言中进行类似的题目练习,可以帮助我们巩固基本的语法和概念,并提升我们的编程能力。
所以,在闲暇时刻,不妨挑战一些简单的编程题目,提升自己的编程技能。
火车车厢重排问题栈c语言
火车车厢重排问题栈c语言火车车厢重排问题是一个经典的问题,考验了数据结构和算法的运用。
这个问题可以很好地帮助我们了解如何使用栈这种数据结构来解决实际问题,并且可以通过编写C语言程序对其进行求解。
在本文中,我们将深入探讨火车车厢重排问题,并编写C语言程序实现问题的求解。
首先,让我们来了解一下火车车厢重排问题的具体描述。
假设有一列火车车厢按照编号从1到n的顺序排列在轨道上。
现在我们需要将这些车厢按照特定的顺序重新排列,给定一个目标排列,我们需要找出一种排列车厢的方法,使得最终的排列符合目标排列。
具体而言,对于每一个车厢,我们可以将其从原来的位置移动到一个临时的缓冲轨道中,然后再将其移动到目标位置。
这个问题的关键在于如何确定每个车厢应该如何移动才能满足最终的目标排列。
为了解决这个问题,我们可以使用栈这种数据结构来辅助实现。
栈是一种先进后出的数据结构,这样的特性非常适合用来模拟火车车厢的重排过程。
具体而言,我们可以将原始轨道上的车厢编号序列作为输入,然后使用栈来模拟车辆的移动过程,最终得到目标排列。
下面我们将通过C语言程序来实现这个过程。
首先,我们需要定义一个栈的数据结构,来模拟车厢的移动过程。
我们可以使用数组来实现这个栈,同时需要定义一个栈顶指针来表示当前栈顶元素的位置。
另外,我们还需要定义一个函数来模拟入栈和出栈的过程。
接下来,让我们来具体实现这个栈的数据结构和相关的函数。
```c#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;} Stack;void init(Stack *s) {s->top = -1;}void push(Stack *s, int value) { if (s->top < MAX_SIZE - 1) {s->top++;s->data[s->top] = value;} else {printf("Stack overflow\n");}}int pop(Stack *s) {if (s->top >= 0) {int value = s->data[s->top];s->top--;return value;} else {printf("Stack underflow\n"); return -1;}}int main() {Stack s;init(&s);//对栈进行入栈和出栈操作push(&s, 1);push(&s, 2);push(&s, 3);printf("%d\n", pop(&s)); //输出3printf("%d\n", pop(&s)); //输出2printf("%d\n", pop(&s)); //输出1printf("%d\n", pop(&s)); //输出Stack underflow,表示栈已空return 0;}```在这段代码中,我们定义了一个栈的数据结构,并实现了栈的初始化、入栈和出栈操作。
c语言queue函数用法
C语言queue函数用法1. 什么是队列(queue)队列是一种先进先出(First-In-First-Out,FIFO)的数据结构,类似于排队等候的场景。
在C语言中,我们可以使用队列来处理一系列要按照特定顺序处理的数据。
2. C语言中的queue函数C语言中提供了一些用于操作队列的函数,其中最常用的几个包括push(入队)、pop(出队)、front(获取队头元素)和empty(判断队列是否为空)等。
2.1 push函数push函数用于将一个元素插入到队列的尾部。
如果队列已满,则插入操作将失败。
函数原型如下:void push(queue* q, data_type item);参数说明: - q:指向队列的指针 - item:要插入的元素具体实现:1.检查队列是否已满,如果已满则报错或进行相应处理。
2.将元素插入到队列的尾部,并更新队列的尾指针。
2.2 pop函数pop函数用于删除队列的头部元素,并返回该元素的值。
如果队列为空,则删除操作将失败。
函数原型如下:data_type pop(queue* q);参数说明: - q:指向队列的指针具体实现:1.检查队列是否为空,如果为空则报错或进行相应处理。
2.获取队列的头部元素的值,并更新队列的头指针。
3.返回头部元素的值。
2.3 front函数front函数用于获取队列的头部元素的值,但不对队列进行任何改动。
如果队列为空,则该操作失败。
函数原型如下:data_type front(queue* q);参数说明: - q:指向队列的指针具体实现:1.检查队列是否为空,如果为空则报错或进行相应处理。
2.返回队列的头部元素的值。
2.4 empty函数empty函数用于判断队列是否为空。
如果队列为空,则返回true;否则返回false。
函数原型如下:bool empty(queue* q);参数说明: - q:指向队列的指针具体实现:1.检查队列是否为空。
火车重排问题C++代码
a[m].EnterQueue(arr[i]);//入队
i++;//i加一实现了对下一个车厢的操作
p=1;//重新置为1
break; }
}
}
if(p==0) //表示上一节车厢没有被处理,程序结束
{
{ Node<T> *p=front->next;
while(p)
{
if(p==NULL)
break;
else
{
cout<<p->data<<' ';
p=p->next;
}
};
}
void main()
{ int n,k,t;
cin>>k;
if(k<=0) throw"必须存在缓冲轨道!";
cout<<"请依次输入火车车车厢号"<<endl;
for(int i=0;i<n;i++)
{
cin>>main[i];
}
cout<<endl;
LinkQueue<int> *huan;
huan=new LinkQueue<int>[k];
s->next=NULL;
rear->next=s;
rear=s;
}
template<class T>
T LinkQueue<T>::DeQueue()
{
if(rear==front) throw"发生下溢";
队列应用-车厢重排
数据结构实验报告实验名称:实验四队列的应用学生姓名:班级:班内序号:15学号:日期:2016.12.211.实验要求题目二:队列的应用利用队列结构实现车厢重排问题。
车厢重排问题如下:一列货车共有n节车厢,每个车厢都有自己的编号,编号范围从1~n。
给定任意次序的车厢,通过转轨站将车厢编号按顺序重新排成1~n。
转轨站共有k个缓冲轨,缓冲轨位于入轨和出轨之间。
开始时,车厢从入轨进入缓冲轨,经过缓冲轨的重排后,按1~n的顺序进入出轨。
缓冲轨按照先进先出方式,编写一个算法,将任意次序的车厢进行重排,输出每个缓冲轨中的车厢编号。
提示:1、一列火车的每个车厢按顺序从入轨进入不同缓冲轨,缓冲轨重排后的进入出轨,重新编排成一列货车。
比如:编号为3的车厢进入缓冲轨1,则下一个编号小于3的车厢则必须进入下一个缓冲轨2,而编号大于3的车厢则进入缓冲轨1,排在3号车厢的后面,这样,出轨的时候才可以按照从小到大的顺序重新编排。
2. 程序分析2.1 存储结构我使用了线性表的链式存储结构,通过建立单链表进行顺序存取初始车厢编号。
每个节点分为data、next。
data域称为数据域,数据通过node结构存储车厢编号;next为指针域,用来储存直接后继的地址。
struct node{int data;node*next;};2.2 程序流程(或程序结构、或类关系图等表明程序构成的内容,一般为流程图等)class LinkQueue{private:node*front;node*rear;public:LinkQueue() //无参构造函数{front = rear = new node;front->next = NULL;}void EnQueue(int x); //入队void show(int num); //输出缓冲轨~LinkQueue(); //析构函数};void line(int*zzj, LinkQueue*jay, int n) //建立缓冲轨队列2.3 关键算法分析入队函数:通过尾插法进行链表队列的入队操作。
算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章 习题参考答案
第3章栈和队列一、基础知识题3.1有五个数依次进栈:1,2,3,4,5。
在各种出栈的序列中,以3,4先出的序列有哪几个。
(3在4之前出栈)。
【解答】34215 ,34251,345213.2铁路进行列车调度时,常把站台设计成栈式结构,若进站的六辆列车顺序为:1,2,3,4,5,6,那么是否能够得到435612, 325641, 154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
【解答】输入序列为123456,不能得出435612和154623。
不能得到435612的理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能让栈底元素1在栈顶元素2之前出栈。
不能得到154623的理由类似,当栈中元素只剩23,且3在栈顶,2不可能先于3出栈。
得到325641的过程如下:1 2 3顺序入栈,32出栈,得到部分输出序列32;然后45入栈,5出栈,部分输出序列变为325;接着6入栈并退栈,部分输出序列变为3256;最后41退栈,得最终结果325641。
得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。
3.3若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?【解答】2和43.4设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e3,e5,e4,e6,e2,e1,则栈S的容量至少应该是多少?【解答】43.5循环队列的优点是什么,如何判断“空”和“满”。
c++数据结构用队列实现火车车厢重排问题,分头文件的完整面向对象代码
bool flag=1;//标记
while(i<n&&flag){ //当入轨中有车厢时
flag=0;
for(int m=0;m<k;m++){ //判断缓冲轨的队尾元素与入轨的元素
if(a[m].GetRear()<arr[i]){
a[m].EnQueue(arr[i]);
}
friend void TrainPermute(int arr[],LinkQueue<T> a[],int n,int k);
};
template<typename T>
LinkQueue<T>::LinkQueue(){
Node<T> *s=new Node<T>;
s->next=NULL;
if(rear==front)
throw"下溢";
Node<T> *p=front->next;
int x=p->data;
front->next=p->next;
if(p->next==NULL)
rear=front;
delete p;
return x;
}
}
else
{
for(int m=0;m<k;m++){
cout<<"第"<<(m+1)<<"个缓冲轨的列车编号\t";
a[m].Trans();
cout<<endl;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与工程学院
《算法与数据结构》试验报告[一]
专业班级10级计算机工程02 试验地点计算机大楼计工教研室学生学号1005080222 指导教师蔡琼
学生姓名肖宇博试验时间2012-4-21
试验项目算法与数据结构
试验类别基础性()设计性()综合性(√)其它()试
验目的及要求(1)掌握队列的特点及其存储方法;(2)掌握队列的常见算法和程序实现。
成绩评定表
类别评分标准分值得分合计
上机表现积极出勤、遵守纪律
主动完成设计任务
30分
程序与报告程序代码规范、功能正确
报告详实完整、体现收获
70分
goto label2;
}
else if(r!=0)
{
printf("重排前的序列为\n");
for(i=1;i<=k;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
printf("排列后的车厢号为:\n");
reset(q,w1,w2,k);
}
else
{
printf("我也不知道错哪了?'");
}
}
四、测试用例(尽量覆盖所有分支)
1.输入正确的序列后得到结果如图:
2.倒输这几个数如图:
3.顺序输这个序列
4.如果输入的车厢数有误的时候(为负数或零)
5.如果输入的序列不是连续自然数。