两个队列实现一个栈思路c语言,利用栈实现队列(C语言实现)

在上一篇

这里主要实现的是:利用栈来实现队列

基本思路:

1,创建两个栈

2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列

3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移入outstack中,出栈顺序为:5,4,3,2,1.  那么入outsatck的时候,进栈的顺序同样为 : 5,4,3,2,1(5为栈底),那么出outstack的时候,顺序即为:1,2,3,4,5  这样就做到了入是1,2,3,4,5

出也是1,2,3,4,5  这样就跟队列是一样一样的了。

代码实现思路:

实现思路

准备两个栈用于实现队列:inStack和outStack

当有新元素入队时: :将其压入 将其压入inStack中

当需要出队时:

当outStack为空时:

1. 将inStack中的元素逐一弹出并压入outStack中

2. 将outStack的栈顶元素弹出

当outStack不为空时:

– 直接将outStack的栈顶元素弹出

源代码入下:

这里用到了栈的代码,具体可以参阅:栈的实现与操作(C语言实现)

头文件:

#ifndef _SPQueue_H_

#define _SPQueue_H_

typedef void SPQueue;

SPQueue* SPQueue_Create();

void SPQueue_Destroy(SPQueue* queue);

void SPQueue_Clear(SPQueue* queue);

int SPQueue_Append(SPQueue* queue, void* item);

void* SPQueue_Retrieve(SPQueue* queue);

void* SPQueue_Header(SPQueue* queue);

int SPQueue_Length(SPQueue* queue);

#endif

源文件:

// 栈实现队列.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "SPQueue.h"

#include "LinkStack.h"

#include

#include

typedef struct

{

LinkStack * instack;

LinkStack * outstack;

} TSPQueue;

int _tmain(int argc, _TCHAR* argv[])

{

SPQueue* queue = SPQueue_Create();

int a[10] = {0};

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i + 1;

SPQueue_Append(queue, a + i);

}

printf("第一次进队列:");

printf("Header: %d\n", *(int*)SPQueue_Header(queue));

printf("Length: %d\n", SPQueue_Length(queue));

for(i=0; i<5; i++)

{

printf("%d\t出队列了\n", *(int*)SPQueue_Retrieve(queue));

}

printf("\n第二次进队列:\n");

printf("Header: %d\n", *(int*)SPQueue_Header(queue));

printf("Length: %d\n", SPQueue_Length(queue));

for(i=0; i<10; i++) //继续尾加10个节点

{

a[i] = i + 1;

SPQueue_Append(queue, a + i);

}

while( SPQueue_Length(queue) > 0 )

{

printf("%d\t出队列了\n", *(int*)SPQueue_Retrieve(queue));

}

SPQueue_Destroy(queue);

system("pause");

return 0;

}

//创建

SPQueue* SPQueue_Create()

{

TSPQueue* ret = (TSPQueue*)malloc(sizeof(TSPQueue));

if (NULL != ret)

{

ret->instack = LinkStack_Create();

ret->outstack = LinkStack_Create();

if ((NULL == ret->instack) && (NULL == ret->outstack))

{

LinkStack_Destroy(ret->instack);

LinkStack_Destroy(ret->outstack);

free(ret);

ret = NULL;

}

}

return ret;

}

//销毁

void SPQueue_Destroy(SPQueue* queue)

{

SPQueue_Clear(queue);

free(queue);

}

//清空

void SPQueue_Clear(SPQueue* queue)

{

TSPQueue* SPQueue = (TSPQueue*)queue;

if (NULL != SPQueue)

{

LinkStack_Clear(SPQueue->instack);

LinkStack_Clear(SPQueue->outstack);

}

}

//尾加

int SPQueue_Append(SPQueue* queue, void* item)

{

TSPQueue* SPQueue = (TSPQueue*)queue;

int ret = 0;

if (NULL != SPQueue)

{

ret = LinkStack_Push(SPQueue->instack,item);

}

return ret;

}

//删除头部

void* SPQueue_Retrieve(SPQueue* queue)

{

TSPQueue* SPQueue = (TSPQueue*)queue;

void * ret = NULL;

if (NULL != SPQueue)

{

//当outstack长度为0时,把instack中的数据移入outstack

if (LinkStack_Size(SPQueue->outstack) == 0)

{

while (LinkStack_Size(SPQueue->instack) > 0)

{

LinkStack_Push(SPQueue->outstack,LinkStack_Pop(SPQueue->instack));

}

}

//取出outstack的栈顶

ret = LinkStack_Pop(SPQueue->outstack);

}

return ret ;

}

//获得头部

void* SPQueue_Header(SPQueue* queue)

{

TSPQueue* SPQueue = (TSPQueue*)queue;

void * ret = NULL;

if (NULL != SPQueue)

{

if (LinkStack_Size(SPQueue->outstack) == 0)

{

while (LinkStack_Size(SPQueue->instack) > 0)

{

LinkStack_Push(SPQueue->outstack,LinkStack_Pop(SPQueue->instack));

}

}

ret = LinkStack_Top(SPQueue->outstack);

}

return ret ;

}

//长度

int SPQueue_Length(SPQueue* queue)

{

TSPQueue* SPQueue = (TSPQueue*)queue;

int ret = 0;

if (NULL != SPQueue)

{

ret = LinkStack_Size(SPQueue->instack) + LinkStack_Size(SPQueue->outstack);

}

return ret;

}

运行结果:

第一次进队列:Header: 1

Length: 10

1 出队列了

2 出队列了

3 出队列了

4 出队列了

5 出队列了

第二次进队列:

Header: 6

Length: 5

6 出队列了

7 出队列了

8 出队列了

9 出队列了

10 出队列了

1 出队列了

2 出队列了

3 出队列了

4 出队列了

5 出队列了

6 出队列了

7 出队列了

8 出队列了

9 出队列了

10 出队列了

请按任意键继续. . .

如有错误,望不吝指出。

原文:http://blog.csdn.net/u010590318/article/details/32332375

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用一个队列实现一个,具体思路如下: 1. 定义一个队列结构体,包含一个数组和两个指针 front 和 rear,分别指向队列的头和尾。 2. 定义一个结构体,包含一个队列的指针和一个整数 top,表示顶元素的下标。 3. 入操作时,将元素插入队列的尾部,同时更新 top 的值。 4. 出操作时,将队列的 rear 指针指向的元素弹出,同时更新 top 的值。 5. 判断是否为空时,判断 top 的值是否为 -1。 下面是示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 定义队列结构体 typedef struct { int data[MAXSIZE]; int front; // 队首指针 int rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue *q) { q->front = q->rear = -1; } // 判断队列是否为空 int isEmpty(Queue *q) { return q->front == -1; } // 判断队列是否已满 int isFull(Queue *q) { return (q->rear + 1) % MAXSIZE == q->front; } // 入队操作 void enqueue(Queue *q, int x) { if (isFull(q)) { printf("Queue is full.\n"); return; } if (isEmpty(q)) { q->front = q->rear = 0; } else { q->rear = (q->rear + 1) % MAXSIZE; } q->data[q->rear] = x; } // 出队操作 int dequeue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty.\n"); return -1; } int x = q->data[q->front]; if (q->front == q->rear) { q->front = q->rear = -1; } else { q->front = (q->front + 1) % MAXSIZE; } return x; } // 定义结构体 typedef struct { Queue *q; int top; // 顶指针 } Stack; // 初始化 void initStack(Stack *s) { s->q = (Queue *) malloc(sizeof(Queue)); initQueue(s->q); s->top = -1; } // 判断是否为空 int stackIsEmpty(Stack *s) { return s->top == -1; } // 入操作 void push(Stack *s, int x) { enqueue(s->q, x); s->top++; } // 出操作 int pop(Stack *s) { if (stackIsEmpty(s)) { printf("Stack is empty.\n"); return -1; } int i, x; // 将队列中的前 top 个元素出队再入队,实现的弹出操作 for (i = 0; i < s->top; i++) { x = dequeue(s->q); enqueue(s->q, x); } // 弹出顶元素 x = dequeue(s->q); // top 减 1 s->top--; return x; } int main() { Stack s; initStack(&s); push(&s, 1); push(&s, 2); push(&s, 3); printf("%d\n", pop(&s)); // 3 printf("%d\n", pop(&s)); // 2 printf("%d\n", pop(&s)); // 1 printf("%d\n", pop(&s)); // Stack is empty. return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值