第三章 栈和队列 —— 顺序栈的基本操作

顺序栈的基本操作

在这里插入图片描述
在这里插入图片描述
代码如下:

#include <iostream>
#include <stdlib.h>

#define STACK_INIT_SIZE 100//栈初始大小
#define STACKINCREMENT 10//每次增加大小
#define OK 1
#define ERROR 0
#define OVERFlOW -2

using namespace std;
typedef int SElemType_Sq;
typedef int Status;

//定义存储表示
typedef struct
{
    SElemType_Sq *base;
    SElemType_Sq *top;
    int stacksize;
} SqStack;

//初始化
Status InitStack_Sq(SqStack &S)
{
    S.base = (SElemType_Sq*)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));
    if(!S.base)
        exit(OVERFlOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}

//销毁顺序栈
Status DestroyStack_Sq(SqStack &S)
{
    if (S.base)
    {
        delete[]S.base;
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
    return OK;
}

//判断顺序栈是否为空
bool StackEmpty(SqStack S)
{
    if (S.top == S.base)
        return true;
    else
        return false;
}

//求顺序栈的长度
int StackLength(SqStack S)
{
    cout<<"顺序栈的长度为:";
    return (S.top - S.base);
}

//清空顺序栈
Status ClearStack(SqStack &S)
{
    S.top = S.base;
    cout<<"成功清空顺序栈"<<endl;
    return OK;
}

//访问栈
Status StackTraverse_Sq(SqStack S)
{
    SElemType_Sq *p = S.top;
    cout<<"顺序栈中元素为:";
    while(p>S.base)
        cout<<(*--p)<<" ";
    cout<<endl;
    return OK;
}

//入栈
Status Push_Sq(SqStack &S)
{
    int n,e;
    cout<<"请输入要入栈的元素个数"<<endl;
    cin>>n;
    cout<<"请输入要入栈元素:"<<endl;
    for (int i=0; i<n; i++)
    {
        cin>>e;
        if (S.top - S.base >= S.stacksize)//栈满
        {
            S.base = (SElemType_Sq*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));
            if (!S.base)//分配内存失败
                exit(OVERFlOW);
            S.top = S.base + S.stacksize;
            S.stacksize += STACKINCREMENT;
        }
        *S.top++ = e;
    }
    cout<<"入栈成功"<<endl;
    return OK;
}

//出栈
Status Pop(SqStack &S)
{
    SElemType_Sq e;
    if (S.top == S.base)
        return ERROR;
    e = *--S.top;
    cout<<"元素"<<e<<"成功出栈"<<endl;
    return OK;
}

//取栈顶元素
Status GetTop(SqStack S)
{
    SElemType_Sq e;
    if (S.top == S.base)
        return ERROR;
    e = *(S.top - 1);
    cout<<"栈顶元素为:"<<e<<endl;
    return OK;
}

void show_help()
{
    cout<<"******* Data Structure ******"<<endl;
    cout<<"1----清空顺序栈"<<endl;//
    cout<<"2----判断顺序栈是否为空"<<endl;//
    cout<<"3----求顺序栈的长度"<<endl;//
    cout<<"4----取栈顶元素"<<endl;
    cout<<"5----入栈"<<endl;//
    cout<<"6----出栈"<<endl;//
    cout<<"7----访问栈"<<endl;//
    cout<<"     退出,输入0"<<endl;

}
int main()
{
    int operate_code;
    show_help();
    SqStack S;
    InitStack_Sq(S);
    while(1)
    {
        cout<<"";
        cin>>operate_code;
        if(operate_code==1)
        {
            ClearStack(S);

        }
        else if (operate_code==2)
        {
            if (StackEmpty(S))
                cout<<"顺序栈为空"<<endl;
            else
                cout<<"顺序栈不为空"<<endl;
        }
        else if (operate_code==3)
        {
            cout<<StackLength(S)<<endl;
        }
        else if (operate_code==4)
        {
            GetTop(S);
        }
        else if (operate_code==5)
        {

            Push_Sq(S);
        }
        else if (operate_code==6)
        {
            Pop(S);
        }
        else if (operate_code==7)
        {
            StackTraverse_Sq(S);
        }
        else if (operate_code==0)
        {
            break;
        }
        else
        {
            cout<<"\n操作码错误!!!"<<endl;
            show_help();
        }
    }
    //销毁顺序栈
    DestroyStack_Sq(S);
    return 0;
}

原创文章 85 获赞 46 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Deam_swan_goose/article/details/104902814