数据结构-03.栈和队列


3.1.栈

3.1.2 栈的存储结构和实现

顺序栈的C语言实现

// 初始容量
#define STACK_INIT_SIZE 100;
// 容量的增量
#define STACKINCREMENT 10;
typedef struct
{
    ElemType *base; //栈底指针,栈构造前和销毁后为空
    ElemType *top;  //栈顶指针,指向栈顶元素的下一位置
    int stacksize;  //当前分配的栈的容量
} SqStack;

顺序栈的基本操作实现

InitStack(&S)
// 构造一个空栈
Status InitStack(SqStack &S)
{
	// 栈底
    S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    // 分配失败
    if (!S.base) exit(OVERFLOW);
    // 栈顶=栈底,因为空栈没有元素
    S.top = S.base;
    // 栈的容量
    S.stacksize = STACK_INIT_SIZE;
    return OK;
} //InitStack
StackEmpty()
	top = base;
Push(e):
	*top++ = e
Status Push(SqStack &S, ElemType e)
{
	// 满了
    if (S.top – S.base == S.stacksize) return ERROR;
    // 栈顶
    *S.top = e;
    // 栈顶扩展一个
    S.top++;
    return OK;
} //Push
Pop(e):
	// 先自减一个,再取值
	e = *--top
Gettop():
	// 取建一个后的值
	e = *(top-1)

3.2.队列

3.2.2 队列的存储结构和实现

链队列的C语言实现

// 链表结点类型
typedef struct QNode
{ 
    QElemType data;
    struct QNode *next;
} QNode, *QueuePtr;

// 队列类型
typedef struct
{                   
    QueuePtr front; // 队头指针
    QueuePtr rear;  // 队尾指针
} LinkQueue;

链队列基本操作的实现

初始化
// 构造一个空队列Q
Status InitQueue(LinkQueue &Q)
{
	// Q.front和Q.rear都指向链表的头结点,这就表示空队列
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    // 分配失败
    if (!Q.front) exit(OVERFLOW);
    // 链表头结点的指针域为空
    Q.front->next = NULL;
    return OK;
}
入队
// 将元素e插入到队列Q中
Status EnQueue(LinkQueue &Q, QElemType e)
{
	// 链表结点
    p = (QueuePtr)malloc(sizeof(QNode));
    // 分配失败
    if (!p) exit(OVERFLOW);
    // 赋值
    p->data = e;
    // 指针域为空
    p->next = NULL;
    // 将原来链表最后一个结点指向新增结点
    Q.rear->next = p;
    // Q.rear指针更新,指向链表最后的元素,即新增元素
    Q.rear = p;
    return OK;
}
出队
// 若队列不空,则队头元素出队列,用e返回其值,返回OK;否则返回ERROR
Status DeQueue(LinkQueue &Q, QElemType &e)
{
	// 空队列
    if (Q.rear == Q.front) return ERROR;
    // 获取队头元素(链表的第一个元素)
    p = Q.front->next;
    // 获取队头元素的值
    e = p->data;
    // 链表的头结点的指针域更新,指向链表的第二个元素
    Q.front->next = p->next;
    // 对于只有一个元素的队列(链表)出队时,那就变成了空队列(Q.rear = Q.front)。
    if (Q.rear == p) Q.rear = Q.front;
    // 释放链表结点
    free(p);
    return OK;
}

循环队列的C语言实现

#define MAXSIZE 100
typedef struct
{
    QElemType *base;
    int front;
    int rear;
} SqQueue;

循环队列基本操作的实现

初始化
Status InitQueue(SqQueue &Q)
{
    // 分配
    Q.base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType));
    // 分配失败
    if (!Q.base) exit(OVERFLOW);
    // 空对列,Q.front = Q.rear,都等于0
    Q.front = Q.rear = 0;
    return OK;
}
入队
// 将元素e插入队列Q的队尾
Status EnQueue(SqQueue &Q, QElemType e)
{
	// 满了。因为Q.rear是从0开始的索引,所以要+1
    if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR;
    // 直接填
    Q.base[Q.rear] = e;
    // 加1
    Q.rear = (Q.rear + 1) % MAXSIZE;
    return OK;
}
出队
// 删除队列Q的队头元素并用e带回
Status DeQueue(SqQueue &Q, QElemType &e)
{
	// 判空
    if (Q.front == Q.rear) return ERROR;
	// 队首元素
    e = Q.base[Q.front];
    // 加1
    Q.front = (Q.front + 1) % MAXSIZE;
    return OK;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值