数据结构与算法_两个栈实现一个队列的功能

用两个栈实现一个队列的功能
#include "stdafx.h"
//#include <stdio.h>
//#include <iostream>
//#include <stdlib.h>
//#include <stdio.h>
#include <malloc.h>
 
//using namespace std;
//using namespace std;
using namespace std;
 
typedef struct node
{
    int data;                                  //结点数值
    node *next;                        //后结点指针
 
}node, *LinkStack;
 
//建立空栈的函数
LinkStack CreateNULLStack(LinkStack &S)
{
    S = (LinkStack )malloc(sizeof(node));       //申请新结点
 
    if(NULL == S)
    {
        printf("Fail to malloc a new node.\n");
        return NULL;
 
    }
 
    S->data = 0;                                //初始化新结点
    S->next = NULL;
 
    return S;
}
//栈结点的插入函数
LinkStack Push(LinkStack &S, int data)
{
    if(NULL == S)                                 //判断是否为有效栈
    {
        printf("There no node in stack!");
        return NULL;
    }
 
    LinkStack p = NULL;
    p = (LinkStack)malloc(sizeof(node));          //申请新结点
    if(NULL == p)
    {
        printf("Failed to malloc a new node.\n");
        return S;
    }
 
    if(NULL == S->next)                            //将新结点压入栈
    {
        p->next = NULL;
    }
    else
    {
        p->next = S->next;
    }
    p->data = data;
    S->next = p;                                   //初始化新结点
 
    return S;
}
 
//栈结点的删除函数
node Pop(LinkStack &S)
{
    node temp;
    temp.data = 0;
    temp.next = NULL;
 
    if(NULL == S)                                 //检验是否为空栈
    {
        printf("There no node in stack!");
        return temp;
    }
 
    temp = *S;
 
    if(S->next ==NULL)
    {
        printf("The stack is NULL, can't pop!\n");
        return temp;
    }
 
    LinkStack p = S->next;                       //栈顶指针向下移
    S->next =S->next->next;
    temp = *p;
 
    free(p);                                      //释放原栈顶结点
    p =  NULL;
    return temp;
}
 
//双栈实现队列的入队函数
LinkStack StackToQueuePush(LinkStack &S, int data)
{
    node n;
    LinkStack S1 = NULL;
    CreateNULLStack(S1);                       //创建空栈
 
    while(NULL != S->next)                    //S出栈入S1
    {
        n = Pop(S);
        Push(S1, n.data);
    }
 
    Push(S1, data);                          //新结点入栈
 
    while(NULL != S1->next)                //S1出栈入S
    {
        n = Pop(S1);
        Push(S, n.data);
    }
    return S;
}
 
//创建一个空队列函数
 
 
 
void main(void)
{
     
     
 
    node n;
    LinkStack S1 = NULL;
 
    CreateNULLStack(S1);
 
    for(int i = 0;i<8;i++)                   //入队列式栈
    {
        StackToQueuePush(S1 , i);
        printf(" %d",i);
     
    }
 
    printf("\n");
 
    while(NULL != S1->next)                  //出队列式栈
    {
        n = Pop(S1);
        printf("%d", n.data);
    }
 
    printf("\n");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值