c语言 两个栈实现队列6,数据结构——两个栈模拟实现一个队列(C语言)

数据结构——两个栈模拟实现一个队列(C语言)

数据结构——两个栈模拟实现一个队列(C语言)

两个栈模拟实现一个队列

实现思路:入栈时存储元素进入栈1,出栈时,将栈1中所有元素取出并放入栈2中,这样栈1中的元素就进行了逆置,即实现了与输入顺序相同。

列子:入栈元素顺序:1,2,3,4,5

那么此时栈1中元素自上而下顺序为:5,4,3,2,1

栈2元素为空。

出栈时,将栈1中元素依次取出放入栈2

此时栈2中元素自上而下顺序为:1,2,3,4,5(即保证了与输入顺序相同)

栈1元素为空

#include

#include

#define MAXSIZE 50

#define ElemType int

typedef struct{

ElemType data[MAXSIZE];

int top;

}SeqStack;

void InitStack(SeqStack *s){

s->top=-1;

}

bool StackEmpty(SeqStack &s){

if(s.top==-1)

return true;

return false;

}

bool Push(SeqStack &s,ElemType e){

if(s.top==MAXSIZE-1)

return false;

s.data[++(s.top)]=e;

return true;

}

bool Pop(SeqStack &s,ElemType &e){

if(s.top==-1)

return false;

e=s.data[(s.top)--];

return true;

}

bool GetTop(SeqStack &s,ElemType &e){

if(s.top==-1)

return false;

e=s.data[s.top];

return true;

}

void check(bool flag){

if(flag)

printf("操作成功!\n");

else

printf("操作失败!\n");

}

void display(SeqStack &s){

int index=s.top;

while(index>-1){

printf("%d ",s.data[index--]);

}

printf("\n");

if(index==s.top)

printf("队列元素为空!");

}

int main(){

int n;

//栈的初始化

SeqStack s,s2;

printf("顺序栈的基本操作\n");

printf("栈1的初始化\n");

InitStack(&s);

printf("栈1的初始化\n");

InitStack(&s2);

printf("模拟队列\n");

while(1){

int op;

int e;

bool flag;

printf("请选择操作\n1.进队列\n2.出队列\n3.判空\n4.获取队列头部元素\n5.打印队列中所有元素\n");

scanf("%d",&op);

switch(op){

case 1:

printf("入队列元素:");

scanf("%d",&e);

flag=Push(s,e);

check(flag);

if(!StackEmpty(s)&&!StackEmpty(s2)){

//如果栈2元素还没弹出时,再栈1加入新元素时,

//为了保证队列的连贯性,必须让前面所有元素出栈2

printf("清除栈2所有元素!\n");

while(!StackEmpty(s2)){

flag=Pop(s2,e);

if(flag)

printf("队列头部元素出队列,出队列元素为:%d\n",e);

}

}

break;

case 2:

while(!StackEmpty(s)){

Pop(s,e);

Push(s2,e);

}

flag=Pop(s2,e);

check(flag);

if(flag)

printf("队列头部元素出队列,出队列元素为:%d\n",e);

break;

case 3:

flag=StackEmpty(s2);

if(StackEmpty(s)&&StackEmpty(s2))

printf("队列为空!\n");

else

printf("队列非空!\n");

break;

case 4:

while(!StackEmpty(s)){

Pop(s,e);

Push(s2,e);

}

flag=GetTop(s2,e);

check(flag);

if(flag)

printf("队列头部元素为:%d\n",e);

break;

case 5:

while(!StackEmpty(s)){

Pop(s,e);

Push(s2,e);

}

display(s2);

default:

break;

}

}

return 0;

}

35790bb205b94ff48c7a3b2318d9731d.png

a23d43e584059e51dddd4b168ba146e9.png

3f7fe21aee159d08daa4cb5f16649157.png

数据结构——两个栈模拟实现一个队列(C语言)相关教程

5340. 【NOIP2017模拟9.2A组】春思

5340. 【NOIP2017模拟9.2A组】春思 题面 两个非负整数A,B 仅一个正整数,表示答案 2 3 15 题解 这道题有N个结论 第一:A可分解为P1b1P2b2...PnbnP1^{b1}P2^{b2}...Pn^{bn}P1b1P2b2...Pnbn(分解质因数) 第二:首先,第一点是正确的,其次,ABA^BAB可表示为P1

ZOJ - 3944 People Counting【暴力模拟】

ZOJ - 3944 People Counting【暴力模拟】 传送门 Sample Input 2 3 3 .O. /| (.) 3 4 OOO( /|\ ())) Sample Output 1 4 题意:给你一个n*m的图,问图中有几个人,图中的某一部分也可以代表一个人 思路:暴力,找到的每一部分都消去和他是同一个人的那部分 #in

[数据结构与算法]太平洋大西洋水流问题(图)

[数据结构与算法]太平洋大西洋水流问题(图) 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。 规定水流只能按照上、下、左、右四个方向流动,且只能从高到低

信号频分复用

信号频分复用 信号频分复用 对锯齿波信号频谱分析,并用两个非原始信号周期整倍数的正弦波信号进行双边带调制 close allclearFs=100000; %采样频率t=0:1/Fs:0.1;x1=sawtooth(1000/7*2*pi*t); %信号周期2pi/(t的系数)figureplot(t,x1,'LineWidth',1.2)axis([0

模拟退火 八皇后_模拟退火和八皇后问题

模拟退火 八皇后_模拟退火和八皇后问题 模拟退火 八皇后 The Simulated Annealing (SA) algorithm is one of many random optimization algorithms. Unlike algorithms like the Hill Climbing algorithm where the intent is to only improve the optimizati

B. Nice Matrix(模拟+贪心)Codeforces Round #675 (Div. 2)

B. Nice Matrix(模拟+贪心)Codeforces Round #675 (Div. 2) 原题链接: https://codeforces.com/contest/1422/problem/B 测试样例 input 2 4 2 4 2 2 4 4 2 2 4 3 4 1 2 3 4 5 6 7 8 9 10 11 18 output 8 42 Note In the first test case we can, for examp

数据结构 树

数据结构 树 本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关。 本文章是自己学习的一些记录。 树的概念: 树是一种抽象数据类型或是实作这种抽象数据类型的数据结构,用来模拟具有树状

ACMer不得不会的线段树,究竟是种怎样的数据结构?

ACMer不得不会的线段树,究竟是种怎样的数据结构? 大家好,欢迎阅读 算法数据结构 专题,今天我们来聊聊一个新的数据结构,叫做线段树。 线段树这个数据结构很多人可能会有点蒙,觉得没有听说过,但是它非常非常有名,尤其是在竞赛圈,可以说是 竞赛圈的必备

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值