文章目錄
- ==**佇列介面見 [演算法開啟小碼農佇列血脈](https://blog.csdn.net/diandengren/article/details/121072953?spm=1001.2014.3001.5501)**==
- 用佇列實作堆疊
- 題目
- 堆疊結構體
- 堆疊初始化
- 入“堆疊”
- 出“堆疊”并取堆疊頂元素
- 取堆疊頂元素
- 判斷堆疊空
- 堆疊銷毀
- 堆疊代碼(介面代碼去我上面文章取) [演算法開啟小碼農佇列血脈](https://blog.csdn.net/diandengren/article/details/121072953?spm=1001.2014.3001.5501)
佇列介面見 演算法開啟小碼農佇列血脈
用佇列實作堆疊
題目

堆疊結構體
typedef struct {
Queue q1;
Queue q2;//兩個佇列
} MyStack;
堆疊初始化
MyStack* myStackCreate() {
MyStack* st = (MyStack*)malloc(sizeof(MyStack));
QueueInit(&st->q1);
QueueInit(&st->q2);
return st;
}
入“堆疊”

void myStackPush(MyStack* obj, int x) {
if(!QueueErase(&obj->q1))
{
QueuePush(&obj->q1,x);
}
else//兩個都為空時push給q2
{
QueuePush(&obj->q2,x);
}
}
出“堆疊”并取堆疊頂元素

int myStackPop(MyStack* obj) {
Queue* emptyQ = &obj->q1;
Queue* nonemptyQ = &obj->q2;//假設q2空,q1非空
//不是我們就互換位置
if(!QueueErase(emptyQ))
{
nonemptyQ = &obj->q1;
emptyQ = &obj->q2;
}
//非空隊長大于一時朝空隊里面挪動資料
while(QueueSize(nonemptyQ)>1)
{
//把非隊空的對頭數拿出push給對空的
QueuePush(emptyQ,QueueFront(nonemptyQ));
//然后把非隊空的對頭數pop掉
QueuePop(nonemptyQ);
}
//因為要回傳堆疊頂資料所以存完再pop
int tmp = QueueFront(nonemptyQ);
//此時非空隊就只還有一個資料,pop掉就行
QueuePop(nonemptyQ);
return tmp;
}
取堆疊頂元素
int myStackTop(MyStack* obj) {
//誰不為空就去誰隊尾資料
if(!QueueErase(&obj->q1))
{
return QueueBack(&obj->q1);
}
else
{
return QueueBack(&obj->q2);
}
}
判斷堆疊空
bool myStackEmpty(MyStack* obj) {
return QueueErase(&obj->q1)&&QueueErase(&obj->q2);
}
堆疊銷毀
void myStackFree(MyStack* obj) {
QueueDestroy(&obj->q1);
QueueDestroy(&obj->q2);
free(obj);
}

堆疊代碼(介面代碼去我上面文章取) 演算法開啟小碼農佇列血脈
typedef struct {
Queue q1;
Queue q2;//兩個佇列
} MyStack;
MyStack* myStackCreate() {
MyStack* st = (MyStack*)malloc(sizeof(MyStack));
QueueInit(&st->q1);
QueueInit(&st->q2);
return st;
}
void myStackPush(MyStack* obj, int x) {
if(!QueueErase(&obj->q1))
{
QueuePush(&obj->q1,x);
}
else//兩個都為空時push給q2
{
QueuePush(&obj->q2,x);
}
}
int myStackPop(MyStack* obj) {
Queue* emptyQ = &obj->q1;
Queue* nonemptyQ = &obj->q2;//假設q2空,q1非空
//不是我們就互換位置
if(!QueueErase(emptyQ))
{
nonemptyQ = &obj->q1;
emptyQ = &obj->q2;
}
//非空隊長大于一時朝空隊里面挪動資料
while(QueueSize(nonemptyQ)>1)
{
//把非隊空的對頭數拿出push給對空的
QueuePush(emptyQ,QueueFront(nonemptyQ));
//然后把非隊空的對頭數pop掉
QueuePop(nonemptyQ);
}
//因為要回傳堆疊頂資料所以存完再pop
int tmp = QueueFront(nonemptyQ);
//此時非空隊就只還有一個資料,pop掉就行
QueuePop(nonemptyQ);
return tmp;
}
int myStackTop(MyStack* obj) {
//誰不為空就去誰隊尾資料
if(!QueueErase(&obj->q1))
{
return QueueBack(&obj->q1);
}
else
{
return QueueBack(&obj->q2);
}
}
bool myStackEmpty(MyStack* obj) {
return QueueErase(&obj->q1)&&QueueErase(&obj->q2);
}
void myStackFree(MyStack* obj) {
QueueDestroy(&obj->q1);
QueueDestroy(&obj->q2);
free(obj);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345806.html
標籤:其他
