栈PART01

目录

一、链栈

链栈类型定义

进栈操作:

出栈操作:

二、顺序栈

顺序栈类型定义

取栈顶元素

入栈

出栈


一、链栈

链栈类型定义

typedef struct node
{
    int data;
    struct node* next;
}LinkStack;

栈顶指针,唯一地确定一个链栈

LinkStack *s;

栈空:s==NULL;

栈的主要运算是在栈顶操作,链表的头部做栈顶,而且不需要附加头结点

进栈操作

void Push(LinkStack *s, int e)
{
    LinkStack *p;
    p=(LinkStack *)malloc(sizeof(LinkStack));
    if(p==NULL)
    {
        printf("ERROR");
        return;
    }
    else
    {
        p->data=e;
        p->next=s;
        s=p;
    }
}

出栈操作

void Pop(LinkStack *s, int &e)
{
    LinkStack *p;
    if(top==NULL)
    {
        printf("underflow");
        return;//函数到此终止
    }
    else
    {
        e=s->data;
        p=s;
        s=s->next;
        free(s);
    }
}

注:void型函数不能return一个值,但是如果只是return;表示函数到此终止。

二、顺序栈

顺序栈类型定义

typedef struct
{
    int *base;
    int *top;
    int stacksize;
}SqStack;

top指向当前最顶元素的下一个位置

栈空:        s.top=s.base;

栈满        s.top-s.base>=s.stacksize;

取栈顶元素

void GetTop(SqStack *s, int &e)
{
    if(s.top==s.base)
        return;
    e=*(s.top-1);
}

入栈

(P22 函数& 疑惑)

void Push(SqStack *s, int e)
{
    if(s.top-s.base>=s.stacksize)
    {
        s.base=(int *)realloc(s.base, (s.stacksize+STACKINCREMENT)*sizeof(int));
        if(!s.base)    return;
        s.top=s.base+s.stacksize;
        s.stacksize+=STACKINCREMENT;
    }
    *s.top=e;
    s.top++;
}

注:顺序栈*s对s解引用,注意与链表区别。实际链表中p->data等价于(*p).data;

        顺序栈中移动指针可以对指针加减运算

出栈

void Pop(SqStack *s, int &e)
{
    if(s.top==s.base)    return;
    s.top--;
    e=*s.top;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值