一.栈
1.栈的顺序实现
Typedef stuct{
ElemType data[stacksize];
int topi;
}sqstack
当一个栈的输入顺序是1,2,3,4,5时,什么样的输出序列是正确的?
当输出开头是输入的最后一个数时,后面输出的数则不能有超过后一个数的
二.队列
3.顺序队列
Comst int QueueSize = 20;
typedef Struct sqqueue{
EemType data[QueueSize];
int front,rear; ##front为头指针,rear为尾指针
}squeue
从图中可以看出,如果指针fornt == rear 队列为空,而当rear ==QueueSize - 时,队列为满,如果在加入新元素,就会产生“溢出”,但是,这种溢出并不是真正的溢出,在data数组的前端可能还有空位置,所以这是一种假溢出,为了能使能够重复利用数组中的储存空间,把数组的前端和后端连接起来,形成一个环形表,成为循环队列。
因此,一维队列可以变成如下图所示
///如何看队列是满还是不满
空的条件是:front == rear
队满的条件是:(rear + 1)%QueueSize== front
front 和rear在循环队列中循环时,当他们到了5是,需要进行/5取余运算,继续从头开始循环。
循环队列算法:
1.队列初始化
目的:分配存储空间
使用void()函数
void initqueue(squeue *qu)
{
qu = (squeue *)malled(size(squeue))
qu ->rear = 0;
qu ->front = 0;
}
2.入队列
int enqueue(squeue *sq, ElemType x)
{
if ((sq ->rear +1)%QueueSize == sq ->front) //判断队列是否为满
return 0;
sq ->rear = (sq ->rear + 1)%QueueSize;
sq ->data[sq -> rear] = x;
return 1;
}
3.出队列
int outqueue(squeue *sq, ElemType x)
{
if(sq ->rear == sq ->front) /判断是否为空
return 0;
sq->front = (sq->front + 1)%QueueSize;
x = sq->data[sq->front];
return 1;
}