数据结构_C语言链表构造栈和队列
0.闲话
才开始学数据结构,写点笔记,加深理解。
栈和队列是数据结构的基础,很多算法都会基于这两个结构,比如dfs基于栈和bfs基于队列。
栈和队列可以用链表构造,也可以用数组构造,我这里是用链表构造,并且是没有长度的
编写语言:C
编写环境:vc++6.0
1.栈
(1)大致意思
其实和汇编语言的堆栈是一个意思,先进后出,后进先出。这里只是用高级语言封装一个PUSH函数和POP函数。
用链表尾表示栈底,链表头表示栈顶。
(2)栈:实现10进制转n进制
这里我就直接贴源码了。可以字节尝试写一下,中间PUSH和POP的过程就参照上图。
#include<stdio.h>
#include<stdlib.h>
typedef struct q
{
int data;
struct q* link;
}Q;
//第二个参数可以是任意数据,或者是已知的一个结构体的首地址。
Q* PUSH(Q* head,int DATA)
{
Q* HEAD;
HEAD = (Q*)malloc(sizeof(Q));
HEAD->data = DATA;
HEAD->link = head;
return HEAD;
}
Q* POP(Q* head)
{
Q* old_head;
if(head->link == NULL)
printf("The stack is empty!");
else
{
printf("%d",head->data);
old_head = head;
head = head->link;
free(old_head);
}
return head;
}
int main()
{
int n,m;
int a;//´æ·ÅÓàÊý
//先构造一个假想的空堆栈
Q* head;
head = (Q*)malloc(sizeof(Q));
head->link = NULL;
printf("please input n: ");
scanf("%d",&n);
printf("please input a number: ");
scanf("%d",&m);
//要先明白10进制转n进制的原理
while(m != 0)
{
a = m%n;
head = PUSH(head , a);
m /= n;
}
while(head->link != NULL)
{
head = POP(head);
}
putchar('\n');
return 0;
}
2.队列
(1)大致意思
类似食堂排队,先排的人先打到饭,然后出队,后排的人在后面跟着,这就是队列的核心先进先出,后进后出 。实现进队 EnQueue和出队OutQueue。
所以,其实和链表存储差不多,只是要注意要特别注意先进先出即可。
如果用链表实现的话。那链表头就是队首,链表尾就是队尾。
(2)队列:实现链式存储
哎,写的时候才发现,队列用结构体很麻烦,还不如直接用指针数组,或者直接用数组来的方便。。。。但是既然觉得了要用链表,还是写完吧。。。
#include<stdio.h>
#include<stdlib.h>
typedef struct q
{
int data;
struct q* link;
}Q;
//第二个参数可以是任意要用于入队的数据。
Q* EnQueue(Q* end,int DATA)
{
Q* END;
END = (Q*)malloc(sizeof(Q));
end->link = END;
END->data = DATA;
//让所有有数据的结构体的link不为NULL。
END->link = (Q*)malloc(sizeof(Q));
(END->link)->link = NULL;//这里使队尾指向NULL
return END;
}
Q* OutQueue(Q* head)
{
Q* HEAD;
if(head->link != NULL)
{
printf("%d\n",head->data);
HEAD = head->link;
free(head);
return HEAD;
}
else
{
printf("The queue is empty!\n");
return head;
}
}
int main()
{
int n;
Q* head;
Q* end;
head = NULL;
printf("please input n:");
scanf("%d",&n);
end = (Q*)malloc(sizeof(Q));//建立一个空队列
end->link = NULL;
head = end;
end = EnQueue(end , n);
head = end;//第一次入队,要建立队首。
for(n -= 1; n>0 ; n--)
end = EnQueue(end , n);
do
head = OutQueue(head);
while(head->link != NULL);
return 0;
}
大家看了有什么不对或是觉得我写的不好的地方,希望大家留言交流。