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

双栈模拟队列
基本思路:队列是先进先出,栈是先进后出。用一个输入栈存进队元素,用一个输出栈将输出栈中的元素倒置,再出栈。这就实现了队列的先进先出。
注意:队满的条件为输入栈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);
}

铁道车厢调度问题
基本思路:用一个栈

#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);
    printf("jjjj");
    Railway(S);
}

原文地址:https://www.cnblogs.com/susususu/p/10854009.html

时间: 2024-10-12 01:48:39

数据结构习题--栈与队列(2)的相关文章

【数据结构】栈和队列

栈和队列 容器数据结构是指一些包含了若干个其他相同或不同的数据结构的数据结构,被包含的这些每一个独立的数据结构都被称为一个元素,在一个容器中的元素往往支持相同的操作,具有类似的性质.之前说到过的线性表其实就是一种容器数据结构,本文中介绍的两种最常用的容器数据结构是栈和队列. 从功能上看,栈和队列大多用于计算过程中保存临时数据,这些数据是在计算过程中发现或产生的.在而后的计算中可能会用到这些数据.如果这些数据是固定的个数以及大小的话,可以构建几个变量来储存它们,但是如果这些数据不确定的话,就需要一

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

数据结构之栈与队列

数据结构的有一个重要结构栈,栈这种数据结构就是满足先进后出的这种规则的数据结构就是栈,引用<大话数据结构>中的一个形象例子就是,子弹的弹夹,最先压入弹夹的子弹最后一个出弹夹,正好往一个栈里添加一个元素叫压栈.入栈,从栈里出来一个元素叫弹栈,出栈.指示器就叫栈帧. 栈图 现在就贴上代码: 栈的几个基本操作: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{

数组拷贝、数组函数、通过数组函数来模拟数据结构的栈和队列、回调的意义、数组函数的排序问题、算法以及寻找素数的筛选法

1.数组的拷贝数组拷贝时指针的指向问题. 数组在拷贝时,指针的位置随之复制[这一点拷贝是完全一样]但是如果拷贝的数组的指针是非法的,那么拷贝出新指针的位置进行初始化<?php$arr1=array('123');end($arr1);next($arr1);//这个指针非法$arr2 = $arr1;//这里进行数组的拷贝var_dump(current($arr2));//得到指向‘123’元素的指针var_dump(current($arr1));//此时这个数组的指针有问题?> 但是拷贝

[ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 2442+1442)

再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个阶段再去探究具体的实现,以及对基本结构的改造! C++标准库中 这里记录一个经典的关于栈和队列的面试题目: 题目:实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法.要保证这三个方法的时间复杂度都是O(1). 思路:重点是getMin()函数的设计,普通思路是设计一

浅谈数据结构系列 栈和队列

计算机程序离不开算法和数据结构,在数据结构算法应用中,栈和队列应用你比较广泛,因为两者在数据存放和读取方面效率比较高,本章节重点讲解两者的基本概念和实现. 基本概念 栈:是一种先进后出,后进先出的数据结构,本质上是线性表,只是限制仅允许在表的一段进行插入和删除工作.此端为栈顶,这是在栈中应用很关键的概念.所有数据的处理都是在栈顶进行的,进栈时,栈中元素增加,栈顶上移一位,出栈时栈顶下移一位.应用中比如:洗碗,每次洗干净的碗放在上面-进栈,取碗,从顶上取出一个-出栈:装子弹-进栈,开枪-出栈. 队

数据结构入门——栈与队列

栈与队列是两种重要的数据结构,有着广泛的应用,他们可以通过对链表功能加以限制改造而来.栈是一种先进后出(FILO)的数据结构,只能在一头进行加入删除,而队列是一种先进先出(FIFO)的数据结构,一头只能加入,另一头只能删除. 栈的实现: # include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct Node { int data; struct Node * pNext; }NO

python——python数据结构之栈、队列的实现

这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出特征的线性数据结构,元素的增加只能在一端进行,元素的删除只能在另一端进行.能够增加元素的队列一端称为队尾,可以删除元素的队列一端则称为队首. 地址在 http://docs.python.org/2/tutorial/datastructures.