题目
思路
代码
//注意点
//后面定义的函数某些都需要empty,因此定义empty时,一定要放到前。
//2个队列的功能一直在互换,判断条件是看那个队列为空
//注意判断2个队列的情况
typedef int QDateType;
typedef struct node
{
QDateType x;
struct node* next;
}Queuenode;//定义队列结点
typedef struct
{
Queuenode* head;
Queuenode* tail;
}Queue;//定义队列
typedef struct {
Queue q1;
Queue q2;
} MyStack;//建立栈,含有2个队列
void QueueInit(Queue* q)//初始化
{
assert(q);
q->head = NULL;
q->tail = NULL;
}
Queuenode* newnode(QDateType x)//创建结点。
{
Queuenode* q = (Queuenode*)malloc(sizeof(Queuenode));
if(q==NULL)
{
perror("q");
exit(-1);
}
q->x = x;
q->next = NULL;
return q;
}
bool QueueEmpty(Queue* q)//因为返回值问题,在判断队列是否为空,只需要与NULL比较.
{
assert(q);
if (q->head == NULL)//空队列
{
return true;
}
else
{
return false;
}
}
void QueueDestroy(Queue* q)//销毁
{
assert(q);
//assert(!QueueEmpty(q));
if(QueueEmpty(q))
{
return;
}else
{
Queuenode* cur = q->head;
while (cur!=NULL)
{
Queuenode* tmp = cur->next;
free(cur);
cur = tmp;
}
q->head = NULL;
q->tail = NULL;
}
}
void QueuePush(Queue* q, QDateType x)//入队列
{
assert(q);
if (QueueEmpty(q))
{
Queuenode* node = newnode(x);
q->head = node;
q->tail = node;
}
else
{
Queuenode* node = newnode(x);
q->tail->next = node;
q->tail = node;
}
}
void QueuePop(Queue* q)//出队列
{
assert(q);
assert (!QueueEmpty(q));//空队列。
Queuenode* tmp = q->head;
q->head = q->head->next;
free(tmp);
tmp = NULL;
}
size_t QueueSize(Queue* q)//获取队列中的元素个数
{
assert(q);
size_t cnt = 0;
Queuenode *cur = q->head;
while (cur!=NULL)
{
++cnt;
cur = cur->next;
}
return cnt;
}
int QueueTop(Queue* q)
{
assert(q);
assert(!QueueEmpty(q));
return q->head->x;
}
MyStack* myStackCreate() {
MyStack *mystack=(MyStack *)malloc(sizeof(MyStack));
if(mystack==NULL)
{
exit(-1);
}
QueueInit(&(mystack->q1));
QueueInit(&(mystack->q2));
return mystack;
}
bool myStackEmpty(MyStack* obj) {
assert(obj);
if(QueueEmpty(&(obj->q1))&&QueueEmpty(&(obj->q2)))
{
return true;
}else
{
return false;
}
}
void myStackPush(MyStack* obj, int x) {
assert(obj);
if(QueueEmpty(&(obj->q1))&&QueueEmpty(&(obj->q2)))
{
QueuePush(&(obj->q1),x);
}
else if(!QueueEmpty(&(obj->q1))&&QueueEmpty(&(obj->q2)))
{
QueuePush(&(obj->q1),x);
}
else if(!QueueEmpty(&(obj->q2))&&QueueEmpty(&(obj->q1)))
{
QueuePush(&(obj->q2),x);
}
}
int myStackPop(MyStack* obj) {
assert(!myStackEmpty(obj));
assert(obj);
int ret=0;
if(!QueueEmpty(&(obj->q1)))
{
size_t cnt =QueueSize(&(obj->q1));
while(cnt>1)
{
QueuePush(&(obj->q2),QueueTop(&(obj->q1)));
QueuePop(&(obj->q1));
--cnt;
}
ret=QueueTop(&(obj->q1));
QueuePop(&(obj->q1));
}
else if(!QueueEmpty(&(obj->q2)))
{
size_t cnt =QueueSize(&(obj->q2));
while(cnt>1)
{
QueuePush(&(obj->q1),QueueTop(&(obj->q2)));
QueuePop(&(obj->q2));
--cnt;
}
ret=QueueTop(&(obj->q2));
QueuePop(&(obj->q2));
}
return ret ;
}
int myStackTop(MyStack* obj) {
assert(obj);
assert(!myStackEmpty(obj));
int ret=0;
if(!QueueEmpty(&(obj->q1)))
{
size_t cnt =QueueSize(&(obj->q1));
while(cnt>1)
{
QueuePush(&(obj->q2),QueueTop(&(obj->q1)));
QueuePop(&(obj->q1));
--cnt;
}
ret=QueueTop(&(obj->q1));
QueuePush(&(obj->q2),QueueTop(&(obj->q1)));
QueuePop(&(obj->q1));
}
else if(!QueueEmpty(&(obj->q2)))
{
size_t cnt =QueueSize(&(obj->q2));
while(cnt>1)
{
QueuePush(&(obj->q1),QueueTop(&(obj->q2)));
QueuePop(&(obj->q2));
--cnt;
}
ret=QueueTop(&(obj->q2));
QueuePush(&(obj->q1),QueueTop(&(obj->q2)));
QueuePop(&(obj->q2));
}
return ret;
}
void myStackFree(MyStack* obj) {
assert(obj);
QueueDestroy(&(obj->q1));
QueueDestroy(&(obj->q2));
}
/**
* Your MyStack struct will be instantiated and called as such:
* MyStack* obj = myStackCreate();
* myStackPush(obj, x);
* int param_2 = myStackPop(obj);
* int param_3 = myStackTop(obj);
* bool param_4 = myStackEmpty(obj);
* myStackFree(obj);
*/
总结
给的东西必然存在它的用处