DataStructure-3-栈

3.1 栈

   3.1.1栈

    栈是限定仅在表尾进行插入删除操作的线性表,允许插入删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈.

3.2 顺序栈

    3.2.1顺序栈

    栈的顺序存储结构称为顺序栈.

  

    3.2.2顺序栈的实现


   SeqStack.h:


#ifndef SEQSTACK_H
#define SEQSTACK_H

#include <stdio.h>
#include <stdlib.h>

//const int StackSize=10;

typedef char DataType;

typedef struct SeqStack
{
    DataType *data;
    int top;
}SeqStack;

int InitStack(SeqStack *s);     //初始化栈
int Push(SeqStack *s,DataType e); //入栈
DataType Pop(SeqStack *s); //出栈
DataType GetTop(SeqStack *s); //取栈顶元素

#endif

SeqStack.c:


include "SeqStack.h"

const int StackSize = 10;


int InitStack(SeqStack *s)
{
    s->data=(DataType*)malloc(StackSize*sizeof(DataType));

    if(s->data == NULL)
    {
        printf("InitStack Error!\n");
        return 0;
    }
    s->top = -1;  //代表栈为NULL
    return 1;
}

int Push(SeqStack *s,DataType e)
{
    if(s->top == StackSize - 1) //栈满
    {
         printf("Stack is full!\n");
        return 0;
    }
    s->top++;
    s->data[s->top] = e;

    return 1;
}

DataType Pop(SeqStack *s)
{
    DataType e;
    if(s->top == -1)   //栈空
    {
        printf("Stack is null!\n");
        return 0;
    }
    e = s->data[s->top];
    s->top--;
    return e;
}

DataType GetTop(SeqStack *s)
{
    DataType e;
    if(s->top == -1) //栈空
    {
        printf("Stack is null!\n");
        return 0;
    }
    return e = s->data[s->top];
}

main.c:

#include "SeqStack.h"

int main(void)
{
    int i;
    SeqStack s;
    //初始化
    InitStack(&s);
    //入栈
    for(i=0;i<5;i++)
    {
        Push(&s,i);
    }
    //出栈
    printf("Pop:%d\n",Pop(&s));
    //取栈顶元素
    printf("GetTop:%d\n",GetTop(&s));
}

   

 


3.3两栈共享内存

    3.3.1两栈共享内存

     当存储栈的数组中没有空闲单元时为栈满,此时栈1的栈顶元素和栈2的栈顶元素位于数组中的相邻位置,即top1=top2-1(或top2=top1+1)。另外,当新元素插入栈2时,栈顶指针top2不是加1而是减1。


    3.3.2两栈共享内存的实现

   BothStack.h:

#ifndef BOTHSTACK_H
#define BOTHSTACK_H

#include <stdio.h>
#include <stdlib.h>

//const int StackSize=10;

typedef char DataType;

typedef struct BothStack
{
    DataType *data;
    int top1;
    int top2;
}BothStack;

int InitStack(BothStack *b);     //初始化栈
int Push(BothStack *b,int i,DataType e); //入栈,i=1代表入栈1,i=2代表入栈2
DataType Pop(BothStack *b,int i); //出栈
DataType GetTop(BothStack *b,int i); //取栈顶元素

#endif


  BothStack.c:

#include "BothStack.h"

const int StackSize = 10;


int InitStack(BothStack *b)
{
    b->data=(DataType*)malloc(StackSize*sizeof(DataType));

    if(b->data == NULL)
    {
        printf("InitStack Error!\n");
        return 0;
    }
    b->top1 = -1;  //代表栈1为NULL
    b->top2 = StackSize; //代表栈2为NULL

    return 1;
}

int Push(BothStack *b,int i,DataType e)
{
    if(b->top1 == b->top2-1) //栈满
    {
        printf("top1:%d\n",b->top1);
        printf("top2:%d\n",b->top2);
        printf("Stack is full!\n");
        return 0;
    }
    if(i==1)
    {
        b->top1++;
        b->data[b->top1] = e;
        printf("top1 push locate:%d\n",b->top1);
    }
    if(i==2)
    {
        b->top2--;
        b->data[b->top2] = e;
        printf("top2 push locate:%d\n",b->top2);
        }

    return 1;
}

DataType Pop(BothStack *b,int i)
{
    DataType e;
    if(i==1)
    {
        if(b->top1 == -1)   //栈空
        {
            printf("Stack1 is null!\n");
            return 0;
        }
        e=b->data[b->top1];
        b->top1--;
        return e;
    }
    if(i==2)
    {
          if(b->top2 == StackSize)   //栈空
        {
            printf("Stack2 is null!\n");
            return 0;
        }
        e=b->data[b->top2];
        b->top2++;
        return e;
    }

    return 0;
}

DataType GetTop(BothStack *b,int i)
{
    if(i==1)
    {
        if(b->top1 == -1)   //栈空
        {
            printf("Stack1 is null!\n");
            return 0;
        }
        return b->data[b->top2];
    }

 if(i==2)
    {
        if(b->top2 == StackSize)   //栈空
        {
            printf("Stack2 is null!\n");
            return 0;
        }
        return b->data[b->top2];
    }


    return 0;
}



  main.c:


#include "BothStack.h"

int main(void)
{
    int i;
    int j;
    BothStack b;
    //初始化
    InitStack(&b);
    //入栈1
    for(i=0;i<3;i++)
    {
        Push(&b,1,i);
    }
    //入栈2
    for(j=0;j<3;j++)
    {
        Push(&b,2,j);
    }

    //出栈1
    printf("Stack1 Pop:%d\n",Pop(&b,1));
    //出栈2
    printf("Stack2 Pop:%d\n",Pop(&b,2));
    //取栈1顶元素
    printf("Stack1 GetTop:%d\n",GetTop(&b,1));
    //取栈2顶元素
    printf("Stack2 GetTop:%d\n",GetTop(&b,2));
}







3.4链栈

    3.4.1链栈

    栈的链接存储结构称为链栈


栈的结构:

 

  入栈:                                                   出栈:

      



    3.4.2链栈的实现


  LinkStack.c :


#ifndef LINKSTACK_H
#define LINKSTACK_H

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;

typedef struct Node
{
    DataType data;
    struct Node *next;
}Node,*LinkStack;

int InitLinkStack(LinkStack *L);
int Push(LinkStack *L,DataType e);
DataType Pop(LinkStack *L);
DataType GetTop(LinkStack *L);

#endif



  LinkStack.c :


#include "LinkStack.h"

int InitLinkStack(LinkStack *L)
{
    (*L) = (LinkStack)malloc(sizeof(LinkStack));
    if(*L == NULL)
    {
        printf("Init Error!\n");
        return 0;
    }
    (*L)->next = NULL;
    return 1;
}
/*必须使用头插法压栈,此时(*L)是头节点,(*L)->next是栈顶元素*/
int Push(LinkStack *L,DataType e)
{
    Node *p;
    p = (Node *)malloc(sizeof(Node));
    p->data=e;
    p->next = (*L)->next;
    (*L)->next = p;
}

DataType Pop(LinkStack *L)
{
    DataType e;
    Node *q;
    if(*L == NULL)
    {
        printf("LinkStack is NULL!\n");
        return 0;
    }
    e = (*L)->next->data;
    q = (*L)->next;
    (*L) = (*L)->next->next;
    free(q);
    return e;
}

DataType GetTop(LinkStack *L)
{
    if(*L == NULL)
    {
        printf("LinkStack is NULL!\n");
        return 0;
    }
    return (*L)->data;
}


  main.c :


#include "LinkStack.h"

int main(void)
{
    LinkStack L;
    //初始化
    InitLinkStack(&L);
    //入栈
    Push(&L,1);
    Push(&L,2);
    //出栈
    printf("Pop:%d\n",Pop(&L));
    //获取栈顶元素
    printf("GetTop:%d\n",GetTop(&L));
    return 0;
}






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值