225. 用队列实现栈-C语言
创始人
2024-02-20 00:17:23
0

题目来源:力扣

题目描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
  • 注意:
  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多调用100 次 pushpoptop 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

思路:

栈的特点是后进先出,队列的特点是先进先出,根据这些的特点,并且让我们使用两个队列来完成栈,我们可以利用队列的特点互相倒数据来完成栈,比如一个队列里有元素1,2,3,4,5,另一个队列为空,我们此时要出栈得到5,我们可以让有数据队列的前四个元素都入到另一个队列里,然后把剩下的那一个元素出栈即可,出栈前我们可以先定义空队列和非空两个指针,用来指向对应的队列,方便后续操作,入栈的话要根据哪个队列有元素就入哪个队列,销毁要先释放两个队列的空间,然后再释放整个栈的空间,初始化要先给栈申请空间,否则就是局部变量,然后要给两个队列初始化

代码实现:

typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;
}Queue;void QueueInit(Queue* pq);//初始化
void QueueDestory(Queue* pq);//销毁
void QueuePush(Queue* pq, QDataType x);//入队列
void QueuePop(Queue* pq);//出队列
QDataType QueueFront(Queue* pq);//取队头元素
QDataType QueueBack(Queue* pq);//取队尾元素
int QueueSize(Queue* pq);//取数据个数
bool QueueEmpty(Queue* pq);//判断是否为空void QueueInit(Queue* pq)//初始化
{assert(pq);pq->head = pq->tail = NULL;
}
void QueueDestory(Queue* pq)//销毁
{assert(pq);QNode* cur = pq->head;while (cur) {QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, QDataType x)//入队列
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL) {printf("malloc fail\n");exit(-1);}newnode->data = x;newnode->next = NULL;if (pq->tail == NULL) {pq->head = pq->tail = newnode;}else {pq->tail->next = newnode;pq->tail = newnode;}
}
void QueuePop(Queue* pq)//出队列
{assert(pq);assert(pq->head);if (pq->head->next == NULL) {free(pq->head);pq->head = pq->tail = NULL;}else {Queue* next = pq->head->next;free(pq->head);pq->head = next;}
}
QDataType QueueFront(Queue* pq)//取队头元素
{assert(pq);assert(pq->head);return pq->head->data;
}
QDataType QueueBack(Queue* pq)//取队尾元素
{assert(pq);assert(pq->head);return pq->tail->data;
}
int QueueSize(Queue* pq)//计算数据个数
{assert(pq);int size = 0;QNode* cur = pq->head;while (cur) {cur = cur->next;size++;}return size;
}
bool QueueEmpty(Queue* pq)//判断是否为空
{assert(pq);return pq->head == NULL;
}typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {MyStack* ps=(MyStack*)malloc(sizeof(MyStack));if(ps==NULL){printf("malloc fail\n");exit(-1);}QueueInit(&ps->q1);QueueInit(&ps->q2);return ps;
}void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}
}int myStackPop(MyStack* obj) {Queue* emptyQ = &obj->q1;Queue* nonemptyQ = &obj->q2;if(!QueueEmpty(&obj->q1)){nonemptyQ = &obj->q1;emptyQ = &obj->q2;}while(QueueSize(nonemptyQ)>1){QueuePush(emptyQ,QueueFront(nonemptyQ));QueuePop(nonemptyQ);}int top=QueueFront(nonemptyQ);QueuePop(nonemptyQ);return top;
}int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {QueueDestory(&obj->q1);QueueDestory(&obj->q2);free(obj);
}/*** 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);
*/

运行结果:

 

相关内容

热门资讯

中加中债-1-3年政策性金融债... 本版导读 2025-12-17 2025-12-17 2025-12-17 2025...
政策红利要击中民生痛点 □ 孟亚生 近日,南通市崇川区百花苑小区43号楼多个单元同步开工加装电梯,全楼住户即将告别无电梯时代...
湖南郴电国际发展股份有限公司关... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
阿塞拜疆媒体:为何理解中国外交... 阿塞拜疆新闻网12月15日文章,原题:中国的外交政策如何影响世界秩序如今,中国在多个大洲扮演着积极且...
电线杆老化倒塌引发野火 美国得... 当地时间12月16日,央视记者获悉,美国得克萨斯州总检察长肯·帕克斯顿当日起诉西南公共服务公司(在得...
百事与沃尔玛:遭集体诉讼,被指... 【12月17日百事与沃尔玛遭消费者集体诉讼,被控合谋价格操纵】12月17日,百事与沃尔玛在纽约联邦法...
雷军在“米粉群”发100个红包... 极目新闻记者 王鹏 12月16日,是小米创办人、董事长兼CEO雷军56岁生日,有多名网友发帖称雷军在...
云南交投生态科技股份有限公司 ... 本公司及董事会全体成员保证信息披露的内容真实、准确、完整,没有虚假记载、误导性陈述或重大遗漏。 一、...
重庆警方:23岁男子公交车猥亵... 重庆市万州区公安局通报,近日网传一女子坐公交被猥亵,该局已于案发当日(11月20日)依法处理完毕。当...
特朗普起诉BBC并索赔百亿美元... 【环球时报报道 记者 周扬】当地时间12月15日,美国总统特朗普就英国广播公司(BBC)剪辑拼接其讲...