C语言用栈模拟实现队列问题详解

 更新时间:2022年04月01日 08:54:10   作者:_奇奇  
本片文章带你分析如何用两个栈,并且只使用栈的基本功能来模拟实现队列,其中同样只实现队列的基本功能,感兴趣的朋友来看看吧

题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)。

你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。

题目链接

用栈实现队列

思路分析

题目的意思是要用两个栈来模拟实现一个队列。仅可以用栈的基本功能实现队列的基本功能。所以需要创建两个栈。所以这两个栈st1,st2可用一个结构体包含。本质就是用两个后进先出的栈,来模拟一个先进先出的队列。

在这里插入图片描述

思路:

在这里插入图片描述

1.st2这个栈用来压栈,st1的作用:把st2的所有值压到st1中,然后经过st1出栈。这样就达到了队列先进先出的性质。

2.st2一直用来压栈。如果st1为空则将st2里面的值全都转移到st1,如果st1不为空,则继续出栈,知道st1为空为止。

代码实现

在这里插入图片描述

ypedef char STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化结构体
void StackInit(ST* ps);
//销毁结构体
void StackDestroy(ST* ps);
//压栈
void StackPush(ST* ps, STDataType x);
//出栈
void StackPop(ST* ps);
//得到栈顶的值
STDataType StackTop(ST* ps);
//判断栈是否为空
bool StackEmpty(ST* ps);
//得到栈的长度
int StackSize(ST* ps);


//初始化结构体
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}
//销毁结构体
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;


}
//压栈
void StackPush(ST* ps, STDataType x)
{

	assert(ps);
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* new = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
		if (new == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		ps->a = new;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}
void StackPop(ST* ps)
{
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}
STDataType StackTop(ST* ps)
{
	assert(ps);
    assert(ps->top>0);
	return ps->a[ps->top-1];
}
bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}
//得到栈的长度
int StackSize(ST* ps)
{
	assert(ps);
	return ps->top;
}



//创建了两个栈
typedef struct
 {
    ST st1;
    ST st2;

} MyQueue;

//对两个栈进行初始化。
MyQueue* myQueueCreate() 
{
    MyQueue* newQueue = (MyQueue*)malloc(sizeof(MyQueue));
    assert(newQueue);
    StackInit(&newQueue->st1);
    StackInit(&newQueue->st2);

    return newQueue;

}

void myQueuePush(MyQueue* obj, int x) 
{
    assert(obj);
    StackPush(&obj->st2, x);

}

int myQueuePop(MyQueue* obj)
 {
     assert(obj);
     if(StackEmpty(&obj->st1))
     {
        while(!StackEmpty(&obj->st2))
        {
          StackPush(&obj->st1,  StackTop(&obj->st2));
            StackPop(&obj->st2);
        }
     }
        int top = 0;
     if(!StackEmpty(&obj->st1))
     {
         top = StackTop(&obj->st1);
         StackPop(&obj->st1);
     }    
    return top;
}

int myQueuePeek(MyQueue* obj) 
{
   assert(obj);
     if(StackEmpty(&obj->st1))
     {
        while(!StackEmpty(&obj->st2))
        {
          StackPush(&obj->st1,  StackTop(&obj->st2));
            StackPop(&obj->st2);
        }
     }
 
     if(!StackEmpty(&obj->st1))
     {
         return StackTop(&obj->st1);
     }
     return 0;
}

bool myQueueEmpty(MyQueue* obj)
{
    return StackEmpty(&obj->st1) && StackEmpty(&obj->st2);
}

void myQueueFree(MyQueue* obj) 
{
    StackDestroy(&obj->st1);
    StackDestroy(&obj->st2);
    free(obj);
}

到此这篇关于C语言用栈模拟实现队列问题详解的文章就介绍到这了,更多相关C语言 栈实现队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 去掉vs2010中ipch文件和.sdf文件的解决方法

    去掉vs2010中ipch文件和.sdf文件的解决方法

    本篇文章介绍了,在vs2010中产生的ipch文件和.sdf文件的解决方法。需要的朋友参考下
    2013-05-05
  • C语言goto语句简单使用详解

    C语言goto语句简单使用详解

    C语言中提供了可以随意滥用的 goto语句和标记跳转的标号,本文主要介绍了C语言goto语句简单使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅析C++字节对齐容易被忽略的两个问题

    浅析C++字节对齐容易被忽略的两个问题

    今天我就和大家分享一下C++字节对齐容易被忽略的两个问题。以下问题也是我实际开发工作中遇到的,如果有不同意见欢迎交流
    2013-07-07
  • 深度剖析C语言结构体

    深度剖析C语言结构体

    今天小编就为大家分享一篇关于深度剖析C语言结构体,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++ 实现对象池的具体方法

    C++ 实现对象池的具体方法

    本文主要介绍了C++ 实现对象池的具体方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • LintCode 堆化详解及实例代码

    LintCode 堆化详解及实例代码

    这篇文章主要介绍了LintCode 堆化详解及实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • 谈谈C++中的单例

    谈谈C++中的单例

    这篇文章主要介绍了C++中单例的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-09-09
  • C++ 字符串string和整数int的互相转化操作

    C++ 字符串string和整数int的互相转化操作

    这篇文章主要介绍了C++ 字符串string和整数int的互相转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C/C++字符串与数字互转的实现

    C/C++字符串与数字互转的实现

    这篇文章主要介绍了C/C++字符串与数字互转的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • C语言代码实现三子棋小游戏

    C语言代码实现三子棋小游戏

    这篇文章主要为大家详细介绍了C语言代码实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论