栈
是一种线性表,他遵守与 “先进后出” 的原则,比如被压入弹夹最后一颗子弹,是被第一个打出去的。
看下图,C是最后个进入,但是第一个出去。
先用数组实现一个简单的栈,他有如下操作:
push 向栈顶压入一个元素
pop 从栈顶弹出元素,pop一个空栈返回-1
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
struct node //栈的类
{
public:
int a[100];
int t = 0;
};
int push(node *n,int i) //入栈
{
n->a[++n->t] = i;
return 0;
}
int pop(node *n)//出栈
{
return n->a[n->t--];
}
int main()
{
int t = 5;
node n;
for(int i = 0;i<5;i++) 把1,2,3,4,5压入栈
push(&n, i);
printf("%d", pop(&n)); //出后三个数
printf("%d", pop(&n));
printf("%d", pop(&n));
system("pause");
return 0;
}
以上代码没考虑超越数组下标后的情况,只是模拟一下而已。
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
就如同排队买东西一样,头部可以出队,只能在尾部入队。
还是用数组模拟一下,头部删除就把head++,尾部增加就把tail++,再head和tail之间才是有效区域
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
struct node //栈的类
{
public:
int a[100];
int head = 0;
int tail = 0;
};
void Add(node* n, int i) //在尾部添加一个 taill++
{
n->a[n->tail++] = i;
}
void Delete(node* n) //头部删除一个,head++
{
n->head++;
}
int main()
{
node n;
for (int i = 0; i < 10; i++) //添加10个元素
Add(&n, i);
for (int i = 0;i < 5; i++) //删除头部五个
Delete(&n);
printf("%d\n", n.a[n.head]);//打印现在头部的
system("pause");
return 0;
}
删除了0,1,2,3,4,这5个数字。