【数据结构】第3章 栈

定义:栈(Stack)是允许在一端进行插入或删除操作的线性表。

        栈顶(Top):线性表允许进行插入删除的那一端。

        栈底(Bottom);固定的。不允许插入和删除的一端。

        空栈:不含任何元素。

        栈的数学性质:当n个不同元素入栈时,出栈元素不同排列顺序(1/(n+1))Cn 2n。

栈的顺序存储结构:(栈是一种操作受限的线性表)

        顺序栈:

                栈的顺序存储类型可描述为:

#define MaxSize 10   //定义栈中元素的最大个数
typedef struct{
    ElemType data[MaxSize];  //存放栈中元素
    int top;  //栈顶指针
}SqStack;

//方法一
void InitStack(SqStact &S){
    S.top = -1;  //初始化栈顶指针
}

//判栈是否为空
bool StackEmpty(SqStack S){
 if(S.top == -1){
        return false; //栈空
    }
    else
        return tuer;
}

//进栈操作
bool Push(SqStack &S,Elemtype x){
    if(S.top == MaxSize - 1) //栈满.报错
        return false;
    S.data[++S.top]=x;  //指针先加1,再进栈
    return ture;
}

//出栈

bool Pop(SqStack &S,Elemtype x){
    if(S.top == -1)
        return false;
    S.data[S.top--]=x;  //先出栈,后-1
    return ture;
}
//读栈顶元素
bool GetTop(SqStack S,Elemtype &x){
    if(S.top == -1)
        return false;
   x=S.data[S.top];  //指针先加1,再进栈
    return ture;
}

viod testStack(){
SqStack S;  //声明一个顺序栈(分配空间)
InitStack(S);
.....
}    
    
思考:若初始时Top=0,出栈进栈的操作如何?
bool Push(SqStack &S,Elemtype x){  //进栈
    if(S.top == MaxSize)
        return false;
    S.data[S.top++]=x;  //先进栈,后指针加1
    return ture;
}


bool Pop(SqStack &S,Elemtype x){
    if(S.top == 0)
        return false;
    S.data[--S.top]=x;  //指针先-1,再出栈
    return ture;
}
2.共享栈
#define MaxSize 10   //定义栈中元素的最大个数
typedef struct{
    ElemType data[MaxSize];  //存放栈中元素
    int top0;  //0号栈顶指针
    int top1;  //1号栈顶指针
}SqStack;

//初始化
void InitStack(SqStack &S){
    S.top0 = -1;
    S.top1 = MaxSize;
}

栈满条件:top0+1=top1;

【注】:0号栈入栈时,top0先加1,再赋值;1号栈入栈时,top1先减1,再复值;
栈的链式存储结构:

        进栈对应用头插法建立单列表

typedef struct Linknode{
    Elemtype data;  //数据域
    struct Linknode *next;//指针域
}ListStack;  //栈类型定义

void InintStack(ListStack &Lhead){
    Lhead = NUll; //不带头节点
    return ture;
}
//进栈
void Push(ListStack &Lhead,Elemtype x){
    Linknode *q=(LinkList *)malloc(sizeof(ListStack));
    q->data = x;
    q->next = Lhead;
    Lhead = q;  //头指针指向新节点
    return ture;
}
//出栈
void Pop(ListStack &Lhead,Elemtype &x){
    x=Lhead->data;
    Linknode *p=Lhead;    
    Lhead = Lhead->next;
    free(p);
    return ture;
}

viod testStack(){
    ListStack Lhead;    
    InitStack(head);
.....
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值