利用两个队列(单链表模拟)实现栈数据结构
创始人
2025-05-31 21:02:43

利用队列实现栈数据结构

225. 用队列实现栈 - 力扣(LeetCode)

typedef int QueueDataType;
typedef struct QueueNode
{QueueDataType data;struct QueueNode* next;
}QueueNode;typedef struct Queue
{QueueNode* head;QueueNode* tail;int size;
}Queue;void QueueInit(Queue* pq)
{assert(pq);pq->head=NULL;pq->tail=NULL;pq->size=0;
}void QueueDestroy(Queue* pq)
{assert(pq);QueueNode* cur=pq->head;QueueNode* next=NULL;while(cur!=NULL){next=cur->next;free(cur);cur=next;}pq->head=NULL;pq->tail=NULL;pq->size=0;free(pq);
}//入队
void QueuePush(Queue* pq, QueueDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode==NULL){perror("QueuePush::Malloc");return;}newnode->next=NULL;newnode->data=x;if (pq->head!=NULL){pq->tail->next=newnode;pq->tail=newnode;}else{pq->head=newnode;pq->tail=newnode;}pq->size++;
}//出队
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head!=NULL);QueueNode* next=pq->head->next;free(pq->head);pq->head=next;if (pq->head==NULL){pq->tail=NULL;}pq->size--;
}int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size==0;
}QueueDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;
}QueueDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}//
typedef struct 
{Queue* q1;Queue* q2;
} MyStack;MyStack* myStackCreate() 
{MyStack* pst = (MyStack*)malloc(sizeof(MyStack));if (pst==NULL){perror("myStackCreate::malloc");return NULL;}pst->q1 = (Queue*)malloc(sizeof(Queue));if (pst->q1==NULL){perror("myStackCreate::malloc");return NULL;}pst->q2 = (Queue*)malloc(sizeof(Queue));if (pst->q2==NULL){perror("myStackCreate::malloc");return NULL;}QueueInit(pst->q1);QueueInit(pst->q2);return pst;
}void myStackPush(MyStack* obj, int x) 
{assert(obj);if (!QueueEmpty(obj->q1)){QueuePush(obj->q1,x);}else{QueuePush(obj->q2,x);}
}int myStackPop(MyStack* obj) 
{assert(obj);Queue* emptyq=obj->q1;Queue* nonemptyq=obj->q2;if (obj->q1->size!=0){emptyq=obj->q2;nonemptyq=obj->q1;}// while(QueueSize(nonemptyq)>1)int num=QueueSize(nonemptyq); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!for (int i=0;iq1)){return QueueBack(obj->q1);}else{return QueueBack(obj->q2);}
}bool myStackEmpty(MyStack* obj) 
{assert(obj);return obj->q1->size==0 && obj->q2->size==0;
}void myStackFree(MyStack* obj) 
{assert(obj);QueueDestroy(obj->q1);QueueDestroy(obj->q2);free(obj);
}

一些说明

利用两个队列可以模拟数据结构栈,原理是这样的:因为我们都知道栈的特性就是后进先出,那我们就这样:

  1. 当这个栈需要入栈的时候,我们那就往有数据的那个队列里面去入队(当然一开始的话,两个队列都是没有数据的,是空的,我们就随便选一个,然后把数据放到那个队列里面去)。

  1. 当这个栈需要出栈时(这个步骤是最为最为核心与关键的),根据栈的尿性,元素出栈的话只能从栈顶出去。因此如果单单依靠单个队列的话是不可能完成的。这时候我们就把队列除了最后一个元素之外的其他所有元素,先全部取出来入到另外一个空的队列里面,然后这些元素每入到一个新队列,我在原先那个队列里面pop一下把它从原先的地方“除籍”,然后接下来原队列到最后弄着弄着就只剩最后一个元素了,这时候就只把它pop一下,这样子的话就相当于完成了出栈。然后到最后其他剩余的元素还是按照原先的顺序,只不过是到了另一个队列里面去了。

  1. 要求栈里面非元素个数,判断是否为空,销毁等等,这些操作的话就非常简单,就会多加以赘述

  1. 对于结构体嵌套以及之间的指针关系,我想进行进一步的说明:

情形一举例:

  1. 一个大结构体a里面有两个小结构体成员b和c,那么当我把这个大结构体a创建出来的时候(无论是在栈区还是堆区malloc出来),这两个小结构体成员也同时被开辟出来(也就是说结构体的完完整整的,实实在在的实体所占据的内存已经被申请出来)。

  1. 一个大结构体a里面有两个小结构体成员指针b和c,那么在这种情形之下,如果说把大结构体a创建出来,(无论是在栈区还是堆区malloc出来),但这时候由于这个大结构体a里面的两个成员是结构体指针,并不是结构体的实体,所以b,c结构体这些个实体还并没有被开辟出来,也就是说在内存当中还没有它们的名分。这时候对于大结构体a的两个成员指针虽然是结构体指针,但并不能拿来用,因为他们实际上现在是野指针。在这种情况之下,就只能在去开辟属于结构体b,c实体的内存空间,然后把这些内存空间的地址赋给两个结构体成员指针,这样的话,这两个结构体成员指针才能够正常使用。

情形二举例:

  1. 在上述1的情况之下,比如说现在有一个函数,它的参数是结构体指针,那么如果我想要去传参的话,我就要a->b,这样子行吗?这样子是不行的,因为这样子的结果是一个结构体,而我如果想要传入结构体的指针的话,就要这样:&a->b(&优先级低)。

  1. 在上述2的情况之下,我的道理,如果我也想往函数参数那边按照它规定传入一个结构体指针,我直接a->b就可以了,懂得吧.

最后,我想说:

for循环除了i之外的那些变量,必须在for循环当中保持不变,否则的话,你苦头有的吃。

相关内容

热门资讯

最新!2025新势力5月销量出... 5月新势力表现如何?2025年5月的销售周期刚刚过去,不少造车新势力厂商的销量数据,已经新鲜出炉。数...
两家A股公司,收终止上市决定 又有两家A股上市公司收到股票终止上市决定,6月10日进入退市整理期。 上述自律监管决定书指出,因2...
重磅,事关教育强国,主力提前埋... 数据是个宝数据宝投资少烦恼这些产业的景气度处于上升期。《求是》杂志发表文章《加快建设教育强国》6月1...
阳光诺和“二刷”收购 80后富... 《投资者网》蔡俊时隔2年后,阳光诺和(688621.SH,下称“公司”)再拟收购同一个资产。实际上,...
买车,不安全了? 买车,不安全... 在新能源汽车市场竞争空前激烈的当下,车企、经销商习惯于采取更加激进的营销、市场策略,尤其在行业加速“...
欧佩克+同意7月再增产41.1... 为了增产惩罚超产国并争夺市场份额,欧佩克+连续第三个月大幅增产,美国页岩油生产商或首当其冲,美油一度...
经济学泰斗菲舍尔逝世:培育伯南... 当地时间6月1日,以色列央行发布声明称,世界著名经济学家、以色列央行前行长及美联储前副主席菲舍尔(S...
更名!“天府证券”来了 天府证... 【导读】宏信证券更名为天府证券中国基金报记者 吴君这家券商,历史上第二次更名。5月末,工商信息显示,...
两家A股公司,收终止上市决定 ... 又有两家A股上市公司收到股票终止上市决定,6月10日进入退市整理期。*ST鹏博(600804)公告称...
瑞幸降价迈入“6块9”时代?瑞... 说起最近几年的咖啡茶饮市场,相信每个人都不会陌生,各家咖啡茶饮企业的各种降价消息是此起彼伏,就在最近...
主次节奏:6.1黄金 - 每周... 本文每周初更新发布梳理各级别走势分析和预期主次节奏:做有品质的三方服务黄金月线图(超长线) 月线图...
超400亿资金狂涌!这类ETF... 债券ETF市场持续扩容。今年以来,债券市场表现震荡,债券类基金回报远不及预期,但这并未妨碍债券型ET...
坚定信心 行稳致远(记者手记) 侯琳良 最近一段时间,海尔集团上世纪90年代投资制作的《海尔兄弟》动画片,在多个视频平台上线高清重制...
世纪大辩论2——哈耶克与凯恩斯... 本来节后决定启动一个项目,但家里临时有事,需要陪家人去一趟北京,节后拉群的事,因此要推迟一周左右(具...
4月广州消费品市场表现强劲 1-4月,随着消费品以旧换新等促消费政策持续发力和各类会展活动陆续开展,政策相关消费快速增长,升级类...
金价,又跌了! 人民财讯5月31日电,5月30日,COMEX黄金期货收跌0.92%,报3313.1美元/盎司。 从高...
10万吨改性项目!巴斯夫、金发... 【DT新材料】获悉,6月3日,沪市主板新股海阳科技将启动申购,上市在即! 资料显示,海阳科技前身为南...
湾财周报|大事记 比亚迪驳斥“... 一周大事记(5月26日-6月1日) 头条 比亚迪驳斥! 长城“车圈恒大论”是行业警示还是危言耸听?...
通源石油跌1.96%,成交额1... 5月30日,通源石油跌1.96%,成交额1.03亿元,换手率4.40%,总市值23.54亿元。 异动...
中国邮储银行浙江分行2025校... 点这里 ↑ 老满说高考 作者 l 老满 生涯规划师l 升学顾问l 拆书家 这是 老满说高考公众号 的...
公募基金规模首次突破33万亿元... 每经记者:肖芮冬 每经编辑:叶峰 天赐良基日报第654期 一、今日基金新闻速览 1、华润元大基金贾...
湾财周报 大事记 比亚迪驳斥“... 一周大事记(5月26日-6月1日)头条比亚迪驳斥!长城“车圈恒大论”是行业警示还是危言耸听?近日,关...
EL表达式JSTL标签库 EL表达式     EL:Expression Language 表达式语言     ...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
工信部、中汽协紧急发声!汽车“... 文/刘育英新一轮汽车价格战再起。近日,工信部、中汽协纷纷发声表示反对。工业和信息化部表示,将加大对汽...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
募资39亿,全亏光了,账上不到... 关于天然气,用户的感觉是价格一直在上涨,但很奇怪,不管怎么涨,天然气企业仍然亏,还亏得一塌糊涂。这是...
资阳房产评估公司 这是(tel-15828298733)整理的信息,希望能帮助到大家 在当今社会,随着经济的发展和城...
华桥汇利(中国)投资基金管理有... 今年第一季度,美国企业利润出现大幅下降,且面临着来自关税上升的持续压力,这一局面可能会在今年进一步加...
ESG 报告合规与鉴证:全球政... 在当下全球经济格局里,ESG(环境、社会和公司治理)已然成为衡量企业可持续发展能力的关键指标。随着全...