数据结构笔记——栈和队列

 

基础概念

        栈是限定仅在表尾进行插入和删除运算的线性表,把表尾称为栈顶,把表头称为栈底。

        入栈是指在栈顶插入数据元素;出栈是指在栈顶删除数据元素。因此栈是:先进后出,后进先出

        队列只允许在表的一端进行插入,而在另一端进行删除,允许删除的一端称为队头,允许插入的一端称为队尾。

        队列是:先进先出(可以想象成火车过隧道)

顺序栈

用线性表的方式来存储栈,顺序栈结构定义为:

struct Stack
{   
    datatype elements[maxsize];
    int Top;
}

 maxsize是栈的容量,Top指示当前栈顶的位置。

代码实现顺序栈的基本运算

//判断栈是否为空
int EmptyS(struct stack *S)
{
    if(S->Top>=0)
        return 0;
    else
        return 1;
}

//进栈
struct Stack *PushStackS(struct Stack *S,datatype e)
{
    if(S->Top>=MAXSIZE-1)
    {
        printf("栈满上溢");
        return NULL;
    }
    else
    {
        S->Top++;
        S->elements[S->Top]=e;
    }
    return S;
}

// 出栈
datatype *PopS(struct stack *S)
{
    datatype *ret;
    if(EmptyS(S))
    {
        printf("栈空下溢");
        return NULL;
    }
    else
    {
        S->top--
        ret=(datatype*)malloc(sizeof(datatype));
        *ret=S->elements[S->Top+1];
        return ret;
    }
}
//取栈顶元素,只取出元素的值,不调整栈顶指针的值
datatype *GetTopS(struct Stack *S)
{
    datatype *ret;
    if(EmptyS(S))
    {
        printf("空栈");
        return NULL;
    }
    else
    {
        ret=(datatype*)malloc(sizeof(datatype));
        *ret=S->elements[S->Top];
        return ret;
    }
}

多个栈共享存储空间

当一个长须要同时使用多个顺序栈时,为了防止上溢,需要为每个栈分配一个较大的空间,但某个栈发生上溢的同时,可能其余栈未用的空间还很多,如果将这多个栈安排在同一个向量中,即让多个栈共享存储空间。

数据结构笔记——栈和队列_第1张图片

 将两个栈的栈底设在向量空间的两端,让两个栈的栈顶各自向中间延伸,只有当整个向量空间都被两个栈占满时,才会发生上溢,栈满的条件是两个栈的栈顶相遇。

链栈

栈的链式存储结构成为链栈,它是运算首先的单链表,其插入和删除操作仅在表头进行。栈顶是Top指针,它唯一地确定一个链栈。当Top等于NULL时为空栈

代码实现顺序栈的基本运算

//插入数据元素e
struct Node *PushL(struct Node *S,datatype e)
{
    struct Node *p;
    p=(struct Node*)malloc(sizeof(struct Node));
    p->element=e;
    p->next=S;
    S=p;
    return S;
}

//删除栈顶元素并返回
datatype*PopL(struct Node *S)
{
    datatype *ret;
    if(S==NULL)
    {
        printf("栈空\n");
        return NULL;
    }
    else
    {
        ret=(datatype*)malloc(sizeof(datatype));
        *ret=S->element;
        S=S->next;
        return ret;
    }
}

栈的应用

满足LIFO即先进后出原则,均可使用栈做数据结构,例如:

  1. 过程递归调用
  2. “回溯”问题的求解
  3. 表达式求值

顺序队列

        和顺序表一样顺序队列也必须用一个数组来存放当前队列中的元素,由于队列的队头和队尾的位置均是变化的,因此需要设置两个指针,分别指示当前队头元素和队尾元素在数组中的位置。

struct sequeue
{
    datatype data[MAXSIZE];
    int front,rear;
};
struct sequeue *sq;    //*sq:顺序队列的指针

        front是头指针,指向队头元素的前一个位置;rear是尾指针,指向当前队尾元素的位置。

你可能感兴趣的:(日常学习笔记,数据结构,C,语言)