顺序栈的基本操作的实现

一、顺序栈的存储结构

#define MAXSIZE 100
typedef int SElemType;
typedef struct
{
    SElemType *base;//栈底指针
    SElemType *top;//栈顶指针
    int stacksize;//栈可用的最大容量
} SqStack;

 二、顺序栈的初始化

算法步骤:

(1)为顺序栈分配一个最大容量为MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底。

(2)栈顶指针top初始为base,空栈。

(3)stacksize置为栈的最大容量MAXSIZE。

//顺序栈的初始化
int InitStack(SqStack &S)
{
    //构造一个空栈S
    S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
    if(!S.base)
    {
        cout<<"存储分配失败!"<<endl;
        exit(0);

    }
    S.top=S.base;//top初始化为base,空栈
    S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
    cout<<"顺序栈初始化成功!"<<endl;
    return 1;
}

三、顺序栈的入栈

算法步骤:

(1)判断栈是否满

(2)将元素压入栈顶,栈顶指针加1。

//顺序栈的入栈
int Push(SqStack &S,SElemType e)
{
    //插入元素e为新的栈顶元素
    if(S.top-S.base==S.stacksize)
    {
        cout<<"栈满!"<<endl;
        return 0;
    }
    //*S.top++=e;这条等价于下面两条
    *S.top=e;//元素e压入栈顶
    S.top++;//栈顶指针加1
    cout<<"元素入栈成功!"<<endl;
    return e;
}

四、顺序栈的出栈

(1)判断栈是否为空。

(2)栈顶指针减1,栈顶元素出栈。

//顺序栈的出栈
int Pop(SqStack &S,SElemType e)
{
    //删除S的栈顶元素,用e返回其值
    if(S.top==S.base)
    {
        cout<<"出栈失败,栈空!"<<endl;
        return 0;
    }
    //e=*--S.top;等价于以下两条
    --S.top;//栈顶指针减一
    e=*S.top;//栈顶元素赋值给e
    cout<<"出栈成功!"<<endl;
    return e;
}

五、取顺序栈的栈顶元素

算法步骤:

(1)当栈非空时,返回栈顶元素,栈顶指针保持不变。

//取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{
    //返回S的栈顶元素,不修改栈顶指针
    if(S.top!=S.base) //栈非空
    {
        cout<<"取顺序栈的栈顶元素成功!"<<endl;
        return *(S.top-1);//返回栈顶元素的值,栈顶指针保持不变
    }
}

六、从栈底遍历输出栈元素,与多元素入栈

//
void InputStack(SqStack &S)
{
    cout<<"您希望先入栈几个元素:";
    int e,n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个入入栈元素:";
        cin >>e;
        Push(S,e);
    }
}

//遍历输出栈,从栈低往上遍历
void OutPutStack(SqStack &S)
{
    cout<<"- - - - -"<<endl;
    SElemType *p=S.base;
    while (p!=S.top)
    {
        cout<<*p<<endl;
        p++;
    }
    cout<<"- - - - -"<<endl;
}

七、完整代码:

#include <iostream>
#include<stdlib.h>
#define MAXSIZE 100
using namespace std;
typedef int SElemType;
typedef struct
{//顺序栈的存储结构
    SElemType *base;//栈底指针
    SElemType *top;//栈顶指针
    int stacksize;//栈可用的最大容量
} SqStack;

//顺序栈的初始化
int InitStack(SqStack &S)
{
    //构造一个空栈S
    S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
    if(!S.base)
    {
        cout<<"存储分配失败!"<<endl;
        exit(0);

    }
    S.top=S.base;//top初始化为base,空栈
    S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
    cout<<"顺序栈初始化成功!"<<endl;
    return 1;
}
//顺序栈的入栈
int Push(SqStack &S,SElemType e)
{
    //插入元素e为新的栈顶元素
    if(S.top-S.base==S.stacksize)
    {
        cout<<"栈满!"<<endl;
        return 0;
    }
    //*S.top++=e;这条等价于下面两条
    *S.top=e;//元素e压入栈顶
    S.top++;//栈顶指针加1
    cout<<"元素入栈成功!"<<endl;
    return e;
}
//顺序栈的出栈
int Pop(SqStack &S,SElemType e)
{
    //删除S的栈顶元素,用e返回其值
    if(S.top==S.base)
    {
        cout<<"出栈失败,栈空!"<<endl;
        return 0;
    }
    //e=*--S.top;等价于以下两条
    --S.top;//栈顶指针减一
    e=*S.top;//栈顶元素赋值给e
    cout<<"出栈成功!"<<endl;
    return e;
}
//取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{
    //返回S的栈顶元素,不修改栈顶指针
    if(S.top!=S.base) //栈非空
    {
        cout<<"取顺序栈的栈顶元素成功!"<<endl;
        return *(S.top-1);//返回栈顶元素的值,栈顶指针保持不变
    }
}
//
void InputStack(SqStack &S)
{
    cout<<"您希望先入栈几个元素:";
    int e,n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cout<<"请输入第"<<i<<"个入入栈元素:";
        cin >>e;
        Push(S,e);
    }
}

//遍历输出栈,从栈低往上遍历
void OutPutStack(SqStack &S)
{
    cout<<"- - - - -"<<endl;
    SElemType *p=S.base;
    while (p!=S.top)
    {
        cout<<*p<<endl;
        p++;
    }
    cout<<"- - - - -"<<endl;
}


int main()
{
    SqStack S;
    InitStack(S);

    InputStack(S);
    OutPutStack(S);

    int e;
    cout<<Pop(S,e)<<endl;
    OutPutStack(S);
    int top=GetTop(S);
    cout<<"栈顶元素为:"<<top<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值