栈(顺序栈存储结构)

1.定义

   栈就是一种只能在一端进行插入或者删除的线性表。分为栈顶与栈底,其中栈顶允许插入、删除操作。因为这种特性,栈顶的当前位置是动态的,栈顶当前位置有一个被称为栈顶指针的位置指示器标识。

   栈的主要特点是“后进先出”,每次进栈的元素都放在原来栈顶元素之前成为新的栈顶元素,每次出栈的元素也是当前栈顶元素,因此栈也被称为后进先出表。

2.顺序栈存储结构及其基本运算实现

     在了解基本运算前,先来了解有关顺序栈的四个要素。下面列出栈的四种状态图。

由这几种状况图可以得出下面结论:

1.栈空的条件:s -> top = = -1。

2.栈满的条件:s -> top = = MaxSize - 1(数组的最大下标)。

3.元素e的进栈操作:先将栈顶指针top增加1,然后将元素e放在栈顶指针处。

4.出栈的操作:先将栈顶指针top处的元素取出放在e中,然后将栈顶指针减去1。

1.初始化,销毁栈以及对栈进行判空

      初始化:分配一个顺序栈空间,并将栈顶指针置为-1,销毁:释放顺序栈s占用的存储空间。判空:判断条件s -> top = = -1是否成立。

//初始化
void InitStack(SqStack * & s)
{
    s=(SqStack *)malloc(sizeof(SqStack)); //分配一个顺序栈空间,首地址放在s中
    s->top=-1;//栈顶元素置为-1
}
//销毁
void DestorySqStack(SqStack * & s)
{
    free(s);
}
//判空
bool StackEmpty(SqStack * s)
{
    return(s->top==-1);
}

 2.进栈、出栈、取栈顶元素

    进栈:栈不满时先将栈顶指针加1,然后在该位置上插入元素e,并返回真;否则返回假。

    出栈:在栈不为空的情况下先将栈顶元素赋值给e,然后将栈顶指针减1,并返回真;否则返回假

//进栈
bool Push(SqStack * &s,ElemType e)
{
    if(s->top==MaxSize-1) //栈满
    return false;
    s->top++; //栈顶指针加1
    s->data[s->top]=e; //元素e放在栈顶指针处
    return true;
}
//出栈
bool Pop(SqStack *& s,ElemType & e)
{
    if(s->top==-1)
    return false;
    e=s->data[s->top]; //取栈顶元素
    s->top--;
    return true;
}
//取栈顶元素
bool GetTop(SqStack *& s,ElemType & e)
{
    if(s->top==-1)
    return false;
    e=s->data[s->top]; //取栈顶元素
    return true;
}

测试函数:

int main()
{
    ElemType e;
    SqStack *s;
    printf("(1)初始化栈\n");
    InitStack(s);
    printf("(2)依次进栈1,5,3,7,8");
    Push(s,1);
    Push(s,5);
    Push(s,3);
    Push(s,7);
    Push(s,8);
    printf("\n");
    printf("(3)栈为%s\n",(StackEmpty(s)?"空":"非空"));
    printf("(4)出栈序列:");
    while (!StackEmpty(s))
    {
        Pop(s,e);
        printf("%d ",e);
    }
    DestorySqStack(s);
    return 1;  
}

运行结果:

 3.简单应用

   判断字符串是否对称:我们分别给定两个数组,{1,3,4,6,5}(不对称);{1,1,2,1,1}(对称),要求判断它们是否是对称的。这里我们就可以利用栈来进行判断。当n个元素连续进栈,产生的进栈序列与连续出栈序列正好相反我们就认为其对称。

bool symmetry(ElemType str[])
{
    int i;ElemType e;
    SqStack *st;
    InitStack(st);
    for(i=0;str[i]!='\0';i++)//将所有元素进栈
    Push(st,str[i]);
    for(i=0;str[i]!='\0';i++) //处理str所有元素
    {
        Pop(st,e); //退栈元素e
        if(str[i]!=e) //若e与当前串字符不同就不对称
        {
            DestorySqStack(st);
            return false;
        }
    }
    DestorySqStack(st);
    return true;
}

 

3.共享栈

    顺序栈采用一个数组存放栈中的元素,如果需要用到两个类型的相同的栈,这时如果开辟两个栈,就有可能出现一个栈未满另一个栈都快溢出了。为此我们就可以采用共享栈这一方法,

共享栈有以下要素

1.栈空条件:栈1空条件:top1== -1;栈2空条件:top1==MaxSize。

2.栈满条件:top1==top2-1。

3.元素s进栈操作:进栈1操作为top1++;data[top1]=x;进栈2操作:top2--;data[top2]=x。

4.出栈的操作:出栈1操作为x=data[top1];top1--;  出栈2操作:x=data[top2];top2++;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值