目錄
題目來源:
代碼實現(xiàn):
思路分析:
實現(xiàn)過程:
題目來源:
力扣 - 232.用棧實現(xiàn)隊列
題目描述:
代碼實現(xiàn):
我們這里的棧已經(jīng)寫好了,如果對棧還不是很懂的可以看看這篇文章:CSDN - [數(shù)據(jù)結構 -- C語言] 棧(stack)
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top; // 棧頂
int capacity; // 容量
}Stack;
// 初始化棧
void StackInit(Stack* ps);
// 入棧
void StackPush(Stack* ps, STDataType data);
// 出棧
void StackPop(Stack* ps);
// 獲取棧頂元素
STDataType StackTop(Stack* ps);
// 獲取棧中有效元素個數(shù)
int StackSize(Stack* ps);
// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
int StackEmpty(Stack* ps);
// 銷毀棧
void StackDestroy(Stack* ps);
// 初始化棧
void StackInit(Stack* ps)
{
assert(ps);
ps->a = NULL;
//ps->top = -1;//top 指棧頂數(shù)據(jù)
ps->top = 0;//top 指棧頂數(shù)據(jù)的下一個位置
ps->capacity = 0;
}
// 入棧
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->capacity == ps->top)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail:");
return;
}
ps->a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top] = data;
ps->top++;
}
// 出棧
void StackPop(Stack* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
// 獲取棧頂元素
STDataType StackTop(Stack* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top-1];
}
// 獲取棧中有效元素個數(shù)
int StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}
// 檢測棧是否為空,如果為空返回非零結果,如果不為空返回0
int StackEmpty(Stack* ps)
{
assert(ps);
if (0 == ps->top)
return 1;
else
return 0;
}
// 銷毀棧
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
typedef struct {
Stack push;
Stack pop;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
StackInit(&obj->push);
StackInit(&obj->pop);
return obj;
}
void myQueuePush(MyQueue* obj, int x) {
StackPush(&obj->push, x);
}
int myQueuePop(MyQueue* obj) {
int front = myQueuePeek(obj);
StackPop(&obj->pop);
return front;
}
int myQueuePeek(MyQueue* obj) {
if(StackEmpty(&obj->pop))
{
while(!StackEmpty(&obj->push))
{
StackPush(&obj->pop, StackTop(&obj->push));
StackPop(&obj->push);
}
}
return StackTop(&obj->pop);
}
bool myQueueEmpty(MyQueue* obj) {
return StackEmpty(&obj->push) && StackEmpty(&obj->pop);
}
void myQueueFree(MyQueue* obj) {
StackDestroy(&obj->push);
StackDestroy(&obj->pop);
}
思路分析:
我們知道隊列的特性:先入先出;棧的特性:先入后出。因此我們定義兩個棧,一個是入元素的棧(push棧),另一個是出元素的棧(pop棧)。當我們要入隊的時候就把元素直接入到 push棧中,出隊的時候先把 push棧 中的元素全部放入 pop棧 中,將 pop棧 的棧頂元素出棧就能實現(xiàn)隊列的特性。
此題的本質(zhì)是以棧的特性來實現(xiàn)隊列的特性。
實現(xiàn)過程:
1、我們先將棧的所有接口都寫出來。然后我們創(chuàng)建兩個棧,一個是實現(xiàn)入隊功能的棧(push棧),另一個是實現(xiàn)出隊功能的棧(pop棧);
2、我們要實現(xiàn)入隊的時候,將元素入到 push棧 中,要出隊的時候先將 push棧 中的元素轉到 pop棧 中,然后出pop棧 這樣就可以實現(xiàn)出隊時出的是隊頭元素;
3、在出隊的時候我們先看 pop棧 中還有沒有元素,要是有元素我們直接出 pop棧 中的棧頂元素就可以,如果沒有就先將 push棧 中的元素轉到 pop棧 中;入隊的時候直接入到 push棧 中就可以。
對棧還不太明白的朋友可以參考代碼實現(xiàn)那部分的 棧 的那篇文章。
文章來源:http://www.zghlxwxcb.cn/news/detail-463136.html
*** 本篇結束 ***文章來源地址http://www.zghlxwxcb.cn/news/detail-463136.html
到了這里,關于[鏈表OJ題 8] 用棧實現(xiàn)隊列,沒想到你小子的基礎這么好,這么快就做對了的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!