数据结构---------------------------------------顺序栈和链栈的实现

今天想把这个顺序栈实现一下,就翻阅资料整理了一下。

下面分别给出顺序栈和链栈的相应功能的实现。

1)顺序栈的图示:

下面是代码:

#include<iostream>
#include<algorithm>
#include<string.h>
#define MAXSIZE 100
using namespace std;
typedef int SElemType;
typedef int Status;
typedef struct
{
    SElemType *base; //栈底指针
    SElemType *top; //栈顶指针
    int stacksize;
}SqStack;
//顺序栈的初始化
Status InitStack(SqStack &S)
{
    S.base = new SElemType[MAXSIZE]; //为顺序栈分配一个大小为MAXSIZE的数组空间
    if(!S.base)
        return 0;
    S.top = S.base; //栈底和栈顶指针都指向栈底的位置
    S.stacksize = MAXSIZE; //栈的容量为MAXSIZE
    return 1;
}
//判断栈是否为空
int StackEmpty(SqStack S)
{
    if(S.top == S.base)
        return 0;
    else
        return 1;
}
//求顺序栈的长度
int StackLength(SqStack S)
{
    return S.top - S.base;
}
//清空顺序栈
Status ClearStack(SqStack &S)
{
    if(S.base)
        S.top = S.base;
    return 1;
}
//顺序栈入栈
Status StackPush(SqStack &S,SElemType e) //将元素e压入栈顶
{
    if(S.top - S.base == S.stacksize) //栈满的情况
        return 0;
    *S.top++=e; //将元素e压入栈顶并使栈顶指针加1
    return 1;
}
//顺序栈的出栈
Status StackPop(SqStack &S,SElemType &e)
{
    if(S.top == S.base) //栈空的情况
        return 0;
    e = *--S.top; //获取栈顶元素e并使栈顶指针减1
    return 1;
}
//取顺序栈栈顶元素
Status GetTop(SqStack S,SElemType &e)
{
    if(S.top == S.base)
        return 0; //这种情况说明栈空,直接退出
    e = *(S.top - 1);
    return 1;
}
int main()
{
    ios::sync_with_stdio(false);
    SqStack S;
    InitStack(S);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) //往栈中压入n个元素
        StackPush(S,i);
    int t;
    cin>>t;
    while(t--) //弹出栈中t个元素即依次取栈顶元素
    {
        int m;
        cin>>m;
        StackPop(S,m);
        cout<<m<<endl;
    }
    cout<<StackLength(S)<<endl; //输出操作之后栈的长度
    if(StackEmpty(S))
        cout<<"此时栈非空!"<<endl;
    else
        cout<<"栈空!"<<endl;
    ClearStack(S); //清空栈
    if(StackEmpty(S))
        cout<<"此时栈非空!"<<endl;
    else
        cout<<"栈空!"<<endl;
    return 0;
}

2)链栈的实现:

 

代码如下:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef int SElemType;
typedef int Status;
typedef struct StackNode{
    SElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;
//链栈的初始化
void InitStack(LinkStack &S) //构建一个空栈S,栈顶指针置空
{
    S = NULL;
}
//链栈的入栈
Status StackPush(LinkStack &S,SElemType e) //在栈顶插入元素e
{
    LinkStack p; //定义一个p指针
    p = new StackNode; //p指向新生成的结点
    p -> data = e; //将新生成的结点的数据域置为e
    p ->next = S; //将新结点插入栈顶
    S = p; //修改栈顶指针为p
    return 1;
}
//链栈的出栈
Status StackPop(LinkStack &S,SElemType &e) //删除S的栈顶元素,用e返回其值
{
    LinkStack p; //定义一个指向结构体的指针
    if(S == NULL)
        return 0; //栈空
    e = S -> data; //将栈顶元素赋值给e
    p = S; //用p临时保存栈顶元素空间,已备释放
    S = S -> next; //修改栈顶指针
    delete p; //释放原来栈顶元素的空间
    return 1;
}
//链栈的取栈顶元素
SElemType GetTop(LinkStack S) //返回S的栈顶元素,不修改栈顶指针
{
    if(S != NULL)
        return S -> data; //返回栈顶元素的值,栈顶指针不变
}
int main()
{
    ios::sync_with_stdio(false); //这一句可加可不加
    LinkStack S;
    InitStack(S);
    //不妨将2 3 4 5 6这五个元素压入栈底
    int n; //输入n的值为6
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        StackPush(S,i); //含意如上所示
    }
    cout<<GetTop(S)<<endl; //返回栈顶元素,按照约定,应该返回6
    int m;
    cin>>m; //不妨令m == 100
    StackPop(S,m); //栈顶元素6已经被删除
    cout<<GetTop(S)<<endl; //这回再取栈顶元素,输出为5
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值