双栈封装成队列

面试常考该思路

因此总结一下,以免忘记!

思路

1.多文件调用

2.金蝉脱壳(同名同功能不同实现办法)

代码展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>//<>从当前软件安装目录去检索 
#include<stdlib.h>//“”从当前源文件所在的目录去检索,如果无法找到再去当前软件安装目录检索
typedef struct stackNode {
int data;
struct stackNode *next;
} Linkstack;
Linkstack* Create(Linkstack *s) { //建空栈
s=(Linkstack*)malloc(sizeof(Linkstack));
s->next=NULL;
return s;
}
void push(Linkstack *s,int e) { //进栈
Linkstack *p=NULL;
p=(Linkstack*)malloc(sizeof(Linkstack));
p->data=e;
p->next=s->next;
s->next=p;
}
void pop(Linkstack *s,int *e) { //出栈,把栈顶元素出栈并赋值给e
Linkstack *p=s->next;
if(s->next==NULL) {
printf("栈为空");
return;
}
*e=p->data;
s->next=p->next;
free(p);
}
int Stackempty(Linkstack *s) { //判断栈空
if(s->next==NULL)
return 1;//栈空
else
return 0;//栈不空
}

//链栈基本操作
//该文件为第二段代码第3排的“链栈.c”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<stdio.h>//<>从当前软件安装目录去检索 
#include<stdlib.h>//“”从当前源文件所在的目录去检索,如果无法找到再去当前软件安装目录检索
#include"链栈.c"//调用头文件,文件需要在同一文件夹方便检索
Linkstack *S1;//创建s1栈
void enQueue(Linkstack *s,int e)
{
push(s,e);//直接压入s即可
}
void deQueue(Linkstack *s,int *e)
{
int m;
if(!Stackempty(S1))//如果s1不为空,把S1中栈顶元素直接弹出
{
pop(S1,&m);
*e=m;
}
else//如果s1为空,把S中“所有”元素依次弹出并压入s1中,此处所有用while循环实现
{
while(!Stackempty(s))
{
pop(s,&m);
push(S1,m);
}
pop(S1,&m);//再弹出s1的栈顶元素
*e=m;
}
}
int main()
{
Linkstack*S;
int x;
S=Create(S);
S1=Create(S1);//2空栈的创建
enQueue(S,1);
printf("1进队列\n");
enQueue(S,2);
printf("2进队列\n");
deQueue(S,&x);
printf("\n%d出队列\n\n",x);
enQueue(S,3);
printf("3进队列\n");
enQueue(S,4);
printf("4进队列\n");
deQueue(S,&x);
printf("\n%d出队列\n",x);
deQueue(S,&x);
printf("\n%d出队列\n",x);
deQueue(S,&x);
printf("\n%d出队列\n",x);//注意出栈入栈都是单独进行while循环只是为了达到反转一次效果
return 0;
}

自身问题发现

指针与引用理解依旧欠缺