队列(先进先出)
定义结构体:
const int N = 1000+10;
struct Queue
{
int data[N]; //队列的主体,用来存储内容
int head; //队首
int tail; //队尾
};
其中,head用来记录队列的队首(即第一位),tail用来记录队列的末尾(即最后一位)的下一个位置。
在队首删除一个元素的操作是head++
,在队尾增加一个数(假设这个数是x
)的操作是q[tail]=x; tail++
,当队列中没有元素时,head = tail
,表示队列为空。
栈(先进后出)
栈的实现只需要一个一维数组和一个指向栈顶的变量top就可以了,通过top来对栈进行插入和删除操作。
初始化栈:
top = 0;
入栈,假设需要入栈的数是x:
s[ top] = x;
top++;
链表
每个结点都由两个部分组成,左边的部分用来存放具体的数值,右边的部分需要存储下一个结点的地址,可以用指针来实现(也成为后继指针)。
定义结构体:
struct node
{
int data;
node *next;
};
这个结构体有两个成员,第一个成员是整型data,用来存储具体的数值;第二个成员是一个指针,用来存储下一个结点的地址。因为下一个结点的类型也是node。
构建链表:
for(int i = 0; i < n; i++)
{
scanf("%d", &num);
p = (node*)malloc(sizeof(node));
p->data = num;
p->next = NULL;
if(head == NULL)
head = p;
else
q->next = p;
q = p;
}
遍历:
while(t != NULL)
{
printf("%d ", t->data);
t = t->next;
}
插入一个元素:
while(t != NULL)
{
if(t->next == NULL || t->next->data > num)
{
p = (node*)malloc(sizeof(node));
p->data = num;
p->next = t->next;
t->next = p;
break;
}
t = t->next;
}