数据结构栈和队列的基本操作

数据结构栈和队列的基本操作

  • 前言
    • 顺序栈的表示和实现
      • 顺序栈的存储结构
      • 顺序栈中基本操作的实现
        • 1、顺序栈的初始化
        • 2、入栈
        • 3、出栈
        • 4、取栈顶元素
    • 链栈的表示和实现
      • 链栈的存储结构
      • 链栈中基本操作的实现
        • 1、初始化
        • 2、入栈
        • 3、出栈
        • 4、取栈顶元素
  • 队列
    • 队列的链式表示和实现
      • 链队的存储结构
      • 链队中基本操作的实现
        • 1、链队的初始化
        • 2、入队
        • 3、出队
        • 4、取队头元素
    • 循环队列——队列的顺序表示和实现
      • 队列的顺序存储结构
      • 循环队列中基本操作的实现
        • 1、初始化
        • 2、求队列长度
        • 3、入队
        • 4、出队
        • 5、取队头元素
  • 结语

前言

因为这一篇是一次性打完的用到相同的define就没有一个个打出来。

#define MAXSIZE 100
#define OVERFLOW 0
#define OK 1

顺序栈的表示和实现

顺序栈的存储结构

#define MAXSIZE 100//顺序栈存储空间的初始分配量
typedef struct
{
    int *base;//栈底指针
    int *top;//栈顶指针
    int stacksize;//栈可用的最大容量
}SqStack;

顺序栈中基本操作的实现

1、顺序栈的初始化
int InitStack(SqStack *S)
{//构造一个空栈S
    S->base=(int*)malloc(MAXSIZE*sizeof(int));
    if(!S->base)exit(OVERFLOW);
    S->top=S->base;
    S->stacksize=MAXSIZE;
    return OK;
}
2、入栈
int Push(SqStack *S,int e)
{
    if(S->top-S->base==S->stacksize)return OVERFLOW;
    *S->top++=e;
    return OK;
}
3、出栈
int pop(SqStack *S)
{
    int e;
    if(S->top==S->base)return OVERFLOW;
    e=*--S->top;
    return e;
}
4、取栈顶元素
int GetTop(SqStack S)
{
    if(S.top!=S.base)
        return *(S.top-1);
}

链栈的表示和实现

链栈的存储结构

typedef struct StackNode
{
    int data;
    struct StackNode *next;
}StackNode,*LinkStack;

链栈中基本操作的实现

1、初始化
int InitStack(LinkStack S)
{
    S=NULL;
    return OK;
}
2、入栈
int Push(LinkStack S,int e)
{
    LinkStack p;
    p=(StackNode*)malloc(sizeof(StackNode));
    p->data=e;
    p->next=S;
    S=p;
    return OK;
}
3、出栈
int pop(LinkStack S)
{
    int e;
    if(S==NULL)return OVERFLOW;
    e=S->data;
    LinkStack p;
    p=S;
    S=S->next;
    free(p);
    return e;
}
4、取栈顶元素
int GetTop(LinkStack S)
{
    if(S!=NULL)
        return S->data;
}

队列

队列的链式表示和实现

链队的存储结构

typedef struct QNode
{
    int data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQNode;

链队中基本操作的实现

1、链队的初始化
int InitQueue(LinkQNode Q)
{
    Q.front=Q.rear=(QNode*)malloc(sizeof(QNode));
    Q.front->next=NULL;
    return OK;
}
2、入队
int EnQueue(LinkQNode Q,int e)
{
    QueuePtr p;
    p=(QNode*)malloc(sizeof(QNode));
    p->data=e;
    p->next=NULL;Q.rear->next=p;
    Q.rear=p;
    return OK;
}
3、出队
int DeQueue(LinkQNode Q)
{
    if(Q.front==Q.rear)return OVERFLOW;
    QueuePtr p;
    p=Q.front->next;
    int e;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)Q.rear=Q.front;
    free(p);
    return e;
}
4、取队头元素
int GetHead(LinkQNode Q)
{
    if(Q.front!=Q.rear)
        return Q.front->next->data;
}

循环队列——队列的顺序表示和实现

队列的顺序存储结构

typedef struct
{
    int *base;
    int front;
    int rear;
}SqQueue;

循环队列中基本操作的实现

1、初始化
int InitQueue(SqQueue *Q)
{
    Q->base=(int*)malloc(MAXSIZE*sizeof(int));
    if(!Q->base)exit(OVERFLOW);
    Q->front=Q->rear=0;
    return OK;
}
2、求队列长度
int QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
3、入队
int EnQueue(SqQueue *Q,int e)
{
    if((Q->rear+1)%MAXSIZE==Q->front)
        return OVERFLOW;
    Q->base[Q->rear]=e;
    Q->rear=(Q->rear+1)%MAXSIZE;
    return OK;
}
4、出队
int DeQueue(SqQueue *Q,int *e)
{
    if(Q->front==Q->rear)return OVERFLOW;
    e=Q->base[Q->front];
    Q->front=(Q->front+1)%MAXSIZE;
    return OK;
}
5、取队头元素
int GetHead(SqQueue Q)
{
    if(Q.front!=Q.rear)
        return Q.base[Q.front];
}

结语

完整打下来感觉大部分问题都在上一篇博客里解决了,有很多不懂的小伙伴可以看我上一篇博客。然后可能函数的传参是个难点,容易懵,下一篇专门研究这个问题。已完成函数传参详解。

你可能感兴趣的:(笔记,c语言,数据结构,链表,队列)