两个栈S1和S2来模拟一个队列

请利用两个栈S1和S2来模拟一个队列。

已知栈的四个运算定义如下:
Init(ST): 初始化ST栈,初始化完成后的栈为空,没有任何元素;
Push(ST,x): 元素x入ST栈;
Pop(ST,x): ST栈顶元素出栈,赋给变量x;
IsEmpty(ST): 判ST栈是否为空。

那么如何利用栈的运算来实现该队列的四个运算:
InitQueue: 初始化队列,初始化完成后的队列为空,没有任何元素;
EnQueue: 插入一个元素入队列;
DeQueue: 删除一个元素出队列;
IsEmptyQueue: 判队列是否为空。

算法说明:
栈的特点是后进先出,队列的特点是先进先出。所以,用两个栈S1和S2模拟一个队列时,
S1作输入栈,逐个元素压栈,以此模拟队列元素的入队。当需要出队时,将栈S1退栈并逐
个压入栈S2中,S1中最先入栈的元素,在S2中处于栈顶。S2退栈,相当于队列的出队,实
现了先进先出。

实现要求:
1、要求两个栈S1和S2的长度都是5,也就是说队列最多可以存放10个元素,超过10个元素需要返回失败。
2、EnQueue、DeQueue、IsEmptyQueue的返回值请严格按照说明返回,不可以随意变更。
3、请按照算法说明实现该算法,不要采用其他方式实现队列。
请严格按照上述要求实现,否则将导致用例执行失败。

推荐实现步骤:
1、首先实现栈的算法,也就是栈的四个操作。
2、然后参考算法说明,通过对两个栈的操作来模拟一个队列。

StructSize.h

#ifndef _STRUCT_SIZE_H
#define _STRUCT_SIZE_H

#define SUCCESS  0

#define STACK_MAX_SIZE 5
typedef int ElemType; 

typedef struct ST
{
 ElemType data[STACK_MAX_SIZE];  //存放数据
 int top;                       //栈顶指针
}myStack;

int InitQueue(void);
int EnQueue(int elem);
int DeQueue(int* elem);
int IsEmptyQueue(void);

#endif

 

#include "StructSize.h"

myStack g_myStack1,g_myStack2;

//初始化ST栈,初始化完成后的栈为空,没有任何元素;
int InitSt(struct ST* S)
{
  S->top = -1;
  return SUCCESS;
}

//元素x入ST栈;
int Push(struct ST* S, int x)
{
  if( S->top >= STACK_MAX_SIZE - 1 )
 {
  return 1;
 }
 else
 {
  S->top++;
  S->data[S->top] = x;
  return SUCCESS;
 }
}

//ST栈顶元素出栈,赋给变量x;
int Pop(struct ST* S, int* x)
{
    if( S->top <= -1 )
 {
  return 1;
 }
 else
 {
  *x = S->data[S->top];
  S->top--;
  return SUCCESS;
 }
}

//判ST栈是否为空。
int IsEmpty(struct ST* S)
{
     if( -1 == S->top )
 {
  return 1;
 }
 return 0;
}

//初始化队列,初始化完成后的队列为空,没有任何元素;
int InitQueue(void)
{
     InitSt(&g_myStack1);

     InitSt(&g_myStack2);

 return SUCCESS;
}

//将元素Elem插入队列,若入队列成功返回0,否则返回1。
int EnQueue(int Elem)
{
  int Result = 1;
 if( g_myStack1.top >= STACK_MAX_SIZE - 1 )
 {
  if ( g_myStack2.top >= STACK_MAX_SIZE - 1 )
  {
   return 1;
  }
  else
  {
   while( g_myStack2.top < STACK_MAX_SIZE - 1)
   {
    int topData;
    Result = Pop(&g_myStack1,&topData);
    if( SUCCESS == Result )
    {
     Result = Push(&g_myStack2,topData);
    }
   }
   if( SUCCESS == Result )
   {
    Result = Push(&g_myStack1,Elem);
   }
  }
 }
 else
 {
  Result = Push(&g_myStack1,Elem);
 }
 return Result;
}

//从队列中取出一个元素放入pElem,若出队列成功返回0,否则返回1。
int DeQueue(int* pElem)
{
    int Result = 1;
 if(IsEmpty(&g_myStack1) && IsEmpty(&g_myStack2))
 {
  return 1;
 }
 else
 {
  if(IsEmpty(&g_myStack2))
  {
   int topData;
   while(!IsEmpty(&g_myStack1))
   {
    Result = Pop(&g_myStack1,&topData);
    if ( SUCCESS == Result )
    {
     Result = Push(&g_myStack2,topData);
    }
   }
   if ( SUCCESS == Result )
   {
    Result = Pop(&g_myStack2,pElem);
   }
  }
  else
  {
   Result = Pop(&g_myStack2,pElem);
  }
 }
 return Result;
}

//判用队列是否为空,如果是空则返回1,如果不是空则返回0。
int IsEmptyQueue(void)
{
    if(IsEmpty(&g_myStack1) && IsEmpty(&g_myStack2))
  return 1;
 return SUCCESS;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是利用两个s1s2模拟一个队列的C语言代码: ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int top; } Stack; void initStack(Stack *s) { // 初始化 s->top = -1; } void push(Stack *s, int x) { // 入操作 if (s->top == MAXSIZE-1) { printf("Stack Overflow!\n"); return; } s->top ++; s->data[s->top] = x; } int pop(Stack *s) { // 出操作 if (s->top == -1) { printf("Stack Underflow!\n"); return -1; } int x = s->data[s->top]; s->top --; return x; } int getTop(Stack *s) { // 获取顶元素 if (s->top == -1) { printf("Stack Underflow!\n"); return -1; } int x = s->data[s->top]; return x; } int isEmpty(Stack *s) { // 判断是否为空 return s->top == -1; } typedef struct { Stack s1; Stack s2; } Queue; void initQueue(Queue *q) { // 初始化队列 initStack(&q->s1); initStack(&q->s2); } void inqueue(Queue *q, int x) { // 入队操作 push(&q->s1, x); } int outqueue(Queue *q) { // 出队操作 if (isEmpty(&q->s1) && isEmpty(&q->s2)) { printf("Queue Underflow!\n"); return -1; } if (isEmpty(&q->s2)) { // 如果s2为空,则将s1中的元素全部倒入s2中 while (!isEmpty(&q->s1)) { int x = pop(&q->s1); push(&q->s2, x); } } int x = pop(&q->s2); // 此时s2顶元素即为队列头部元素 return x; } int queue_empty(Queue *q) { // 判断队列是否为空 return isEmpty(&q->s1) && isEmpty(&q->s2); } int main() { Queue q; initQueue(&q); inqueue(&q, 1); inqueue(&q, 2); inqueue(&q, 3); printf("%d\n", outqueue(&q)); // 输出队列头部元素1 inqueue(&q, 4); printf("%d\n", outqueue(&q)); // 输出队列头部元素2 printf("%d\n", outqueue(&q)); // 输出队列头部元素3 printf("%d\n", outqueue(&q)); // 输出队列头部元素4 printf("%d\n", outqueue(&q)); // 队列为空,输出-1(队列下溢) return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值