顺序栈

是一种被限制在只能在表的一端进行插入和删除运算的线性表。         (局部变量是用栈来保存的)


可以进行插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),当表中没有元素时(表长为0的栈)称为空栈

栈的修改是按后进先出的原则进行,因此栈被称为后进先出(Last in first out)线性表。

  堆和栈是占一块内存的,栈向下存,堆向上存,当堆和栈相遇的时候内存就占满了
存入与取出
     

基本运算
1.初始化
InitStack(S)
构造一个空栈S

2.StackEmpty(S)
判断栈空,若S为空栈,则返回true,否则返回false

3.StackFull(S)
判断栈满,若S为满栈,则返回true,否则返回false
注意:该运算只适合顺序栈的存储结构。

如果栈需要很大内存的时候可以用虚拟内存的方式,在物理内存不够的时候可以用磁盘的内存来虚拟内存使用。但会使速度变慢。

4.Push(S,x)
进栈,若栈S不满,则将元素x插入到S的栈顶。

5.Pop(S)
退栈,若栈S非空,则将S的栈顶元素删去,并返回该元素。

6.StackTop(S)
取栈顶元素,若栈S非空,则返回栈顶元素,但栈状态不变。

#include <stdio.h>

#define STACKSIZE 100//栈的最大容量

typedef char DataType;//保存的数据类型

typedef  struct

{

    DataType data [STACKSIZE];

    int nTop;//栈顶指针。

}SepStack;//SepStack不是变量,是无名结构的别名。



void InitSack(SepStack *s);

int StackEmpty(SepStack *s);

int StackFull(SepStack *s);

void Push(SepStack *s,DataType x);

DataType *Pop (SepStack *s);

int main(int argc, const char * argv[])

{

    SepStack  stack;

    

    InitSack(&stack);

    StackEmpty(&stack);

    StackFull(&stack);

    char arr = '\0';

    printf("请输入要进栈的字符:\n");

    scanf("%c",&arr);

    Push(&stack, arr);

    

    getchar();//读取输入字符后面的回车。

    printf("请输入要进栈的字符:\n");

    scanf("%c",&arr);

    Push(&stack, arr);

    

    printf("\n");

    char pop=*(Pop(&stack));

    printf("出栈的字符是:%c\n",pop);

    

    getchar();

    printf("请输入要进栈的字符:\n");

    scanf("%c",&arr);

    Push(&stack, arr);

    getchar();

    printf("请输入要进栈的字符:\n");

    scanf("%c",&arr);

    Push(&stack, arr);

    

    printf("\n");

    for (int i=0; i<3; i++)

    {

        char pop=*(Pop(&stack));

        printf("出栈的字符是:%c\n",pop);

    }


        return 0;

}

void InitSack(SepStack *s)//初始化一个栈

{

    s->nTop=-1;

}

int StackEmpty(SepStack *s)//判断栈空

{

   

    return  s->nTop==-1;

}

int StackFull(SepStack *s)//判断栈满。

{

    return s->nTop==STACKSIZE-1;

}

void Push(SepStack *s,DataType x)//进栈。

{

    if (StackFull(s))//判断栈是否满。

    {

        

        printf("栈已满");

        return ;

        

    }

    

   s->data[++s->nTop]=x;

    printf("进栈的字符是:%c\n",s->data[s->nTop]);

}


DataType *Pop (SepStack *s)//退栈。

{

    if (StackEmpty(s))

    {

        printf("是空栈");

        return NULL;

        

    }

    

    return &s->data[s->nTop--];//栈顶元素返回后将栈顶指针减1.

    

}

DataType *StackTop(SepStack *s)//取栈顶元素。

{

    if (StackEmpty(s))

    {

        printf("是空栈");

        return NULL;

    }

    

    return &s->data[s->nTop];

    

    

    

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值