数据结构习题--栈与队列(2)

摘要:
双堆栈模拟队列的基本思想:队列是先进先出的,堆栈是先进先出来的。使用输入堆栈存储团队元素,使用输出堆栈反转输出堆栈中的元素,然后退出堆栈。注意:队列已满的条件是输入堆栈S1已满,而输出堆栈S2不为空#include#include #definemaxsize30typedefint数据类型;typedefstruct{datatypedata[maxsize];inttop;}SeqStack;voidInitial{S-˃top=-1;}intStackIsFull{returnS-˃top==maxsize-1;}intStackIsEmpty{returnS-˃top==-1;}intStackPop{intk;ifreturn0;k=S-˃数据[S-˃top--˃;returnk;}intStackPush{ifretrn0;S-˃data[++S-˃top]=x;return1;}//判断团队是否为空intQueueIsEmpty{returnStackIsEmpty&&StackIsEmpty;}//在队列intEnQueue中{if{if(!QueueIsEmpty){intk;k=DeQueue;printf;}}main(){SeqStack*S1=malloc;SeqStack*S2=malloc;IminateQueue;}铁路车辆调度问题调车场两侧铁路均为单行道,中间有一段“栈道”用于调度,调车场入口处有硬座车和软座车。设计了一种算法,将所有软座汽车调度到硬座汽车的前面。需要输出调度n辆车的结果序列。

双栈模拟队列
基本思路:队列是先进先出,栈是先进后出。用一个输入栈存进队元素,用一个输出栈将输出栈中的元素倒置,再出栈。这就实现了队列的先进先出。
注意:队满的条件为输入栈S1满且输出栈S2非空。并非输入栈满就代表队列满,因为如果输入栈满但输出栈空,可以将输出栈中的元素全部压入输出栈中,这就相当于队列没满,同时如果输出栈中有元素,则输入栈中的元素不能压入输出栈,如果压入就会打乱原有的序列。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 30
typedef int datatype;
typedef struct{
	datatype data[maxsize];
	int top;
}SeqStack;

void Initial(SeqStack *S){
	S->top = -1;
} 

int StackIsFull(SeqStack *S){
    return S->top == maxsize-1;
}

int StackIsEmpty(SeqStack *S){
	return S->top == -1;
}

int StackPop(SeqStack *S){
	int k;
	if(StackIsEmpty(S))
	   return 0;
	k = S->data[S->top--];
	return k;
}

int StackPush(SeqStack *S,datatype x){
	if(StackIsFull(S))
	   return 0;
	S->data[++S->top]=x;
	return 1;
}
//判断队空 
int QueueIsEmpty(SeqStack *S1,SeqStack *S2){
	return StackIsEmpty(S1)&&StackIsEmpty(S2);	
} 
//进队列 
int EnQueue(SeqStack *S1,SeqStack *S2,datatype x){
	if(StackIsFull(S1)){  
	    if(!StackIsEmpty(S2)){
		    printf("用栈模拟的队列已满");
	        return 0;
	    }
		else{
		    int k;
		    while(!StackIsEmpty(S1)){
		       k = StackPop(S1);
		       StackPush(S2,k);
		    }
	    }
	}
	StackPush(S1,x);
	return 1; 
}
// 出队列 
int DeQueue(SeqStack *S1,SeqStack *S2){
	int  k;
	if(QueueIsEmpty(S1,S2)){
	   printf("用栈模拟的队列已空");
	   return 0;
	}
	else{
	    if(StackIsEmpty(S2)){
		    while(!StackIsEmpty(S1)){
			   k = StackPop(S1);
			   StackPush(S2,k);
		    }
	    }
    }
	return StackPop(S2);
}

void ImitateQueue(SeqStack *S1,SeqStack *S2){
	Initial(S1);
	Initial(S2);
	int x;
	printf("请输入进队元素:");
	scanf("%d",&x);
	while(x!=0){
	    EnQueue(S1,S2,x);
	    scanf("%d",&x);
	}
	printf("出队元素为:");
	while(!QueueIsEmpty(S1,S2)){
		int k;
	    k = DeQueue(S1,S2);
		printf("%d",k);
    } 
}

main(){
    SeqStack *S1 = (SeqStack*)malloc(sizeof(SeqStack));
	SeqStack *S2 = (SeqStack*)malloc(sizeof(SeqStack));
	ImitateQueue(S1,S2);
}

铁道车厢调度问题
调车场两侧的铁道均为单向行驶道,中间有一段用于调度的“栈道”,调车场的入口有n节硬座和软座车厢(分别用H和S表示),设计一个算法,把所有软座车厢调度道硬座车厢前面来。要求输出对这n节车厢进行调度的结果序列。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 30
typedef struct {
	char data[maxsize];
	int top;
}SeqStack;

void Initial(SeqStack *S){
	S->top = -1;
	} 
	
int IsFull(SeqStack *S){
	return S->top==maxsize-1;
}

int IsEmpty(SeqStack *S){
	return S->top==-1;
}

int Push(SeqStack *S,char x){
	if(IsFull(S))
	   return 0;
	S->data[++S->top]=x;
	return 1;
}

char Pop(SeqStack *S){
	char c;
	if(IsEmpty (S))
	   return 0;
	   c = S->data[S->top];
	S->top--;
	return c;
}

void Railway(SeqStack *S){
	int i,j=0,n=9;
	char train[n] = {'H','S','H','H','S','H','S','S','H'},result[n];
	for(i=0;i<n;i++){
		if(train[i]=='S')
		  result[j++]=train[i];
		else{
		   Push(S,train[i]);
		   }
	}

	while(!IsEmpty(S)){
		for(;j<n;j++){
			result[j]=Pop(S);
		}
	}
	for(j=0;j<n;j++){
		printf("%c",result[j]);
	}
	
}

main(){
    SeqStack *S = (SeqStack*)malloc(sizeof(SeqStack));
	Initial(S);
	Railway(S);
}

免责声明:文章转载自《数据结构习题--栈与队列(2)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇异步获取CMD命令行输出内容webapi-1 给现有MVC 项目添加 WebAPI下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java成长之路

怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之后开始迷茫的老程序员经常会问到的问题。希望这篇文章会是你看到过的最全面最权威的回答。 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还...

Lua初学习 9-14_03 数据结构 ---&amp;gt; 队列 (自己写的 跟书上差不多)

1:创建一个双向队列 list = { first =1,last = 0} function list:pushFirst(value) --从头放入一个 value local f = self.first-1 -- f=0 self[f] = value --self[0] = value self.first =f -- self.f = 0 --...

python数据结构-数组/列表/栈/队列及实现

首先 我们要分清楚一些概念和他们之间的关系 数组(array)  表(list)  链表(linked list)  数组链表(array list)   队列(queue)  栈(stack) list列表 array数组 python中内置list数据结构 存放的数据类型可以不同。 但是有个缺点 list存放的是数据的索引也就是指针 这需要数据的原有...

算法竞赛专题解析(5):简单数据结构

本系列是这本算法教材的扩展资料:《算法竞赛入门到进阶》(京东当当 ) 清华大学出版社如有建议,请联系:(1)QQ 群,567554289;(2)作者QQ,15512356 目录 1 链表 1.1 动态链表 1.2 用结构体实现单向静态链表 1.3 用结构体实现双向静态链表 1.4 用一维数组实现单向静态链表 1.5 STL list 1.6 链表习题...

数据结构:线性表(顺序表)

1、线性表 (1)定义 具有相同特性的数据元素的一个优先序列 第一个元素是起始结点,最后一个叫做终端结点 a结点的前一个结点叫做直接前驱,后一个结点叫做直接后继 元素可以是简单类型也可以是复杂类型(如:学生)的 2、线性表的顺序存储 (1)概念 把逻辑相邻的数据元素存储在物理上相邻的存储单元中的存储结构 第一个元素的存储位置称作起始地址或基地址 知道某一个...

RedisTemplate访问Redis数据结构(五)——ZSet

Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。有序集合的成员是唯一的,但分数(score)却可以重复。redis正是通过分数来为集合中的成员进行从小到大的排序。 ZSetOperations提供了一系列方法对有序集合进行操作。首先初始化spring工厂获得redis...