Data Structures - Representation and Implementation of Sequential Stacks

/*
    顺序栈的表示和实现
    顺序栈:利用顺序存储结构,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素;
    1.以top=0为栈空,即top=base为栈空;
    2.以top=-1为栈空;

    2019.04.15
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;

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

//顺序栈的初始化
//算法步骤:
//1.为顺序站分配一个最大容量MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底;
//2.栈顶指针top初始化为base,表示栈空;
//3.stacksize置为栈的最大容量MAXSIZE;
Status InitStack(SqStack &S){
    //构造一个空栈S
    S.base=new char[MAXSIZE];   //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
    if(!S.base)     
        exit(OVERFLOW); //存储空间分配失败则退出
    S.top=S.base;   //top初始化为base,栈空
    S.stacksize=MAXSIZE;    //stacksize置为栈的最大容量MAXSIZE
    return OK;
}

//顺序栈的销毁
Status DestroyStack(SqStack &S){
    if(!S.base)
        return ERROR;
    delete S.base;
    return OK;
}

//顺序栈清空
Status ClearStack(SqStack &S){
    if(S.base==S.top||!S.base)
        return ERROR;
    S.top=S.base;
    return OK;
}

//求栈的长度
int StackLength(SqStack S){
    return S.top-S.base;
}


//顺序栈的入栈
//算法步骤:
//1.判断栈是否已满,若满则返回ERROR;
//2.将新元素压入栈顶,栈顶指针加1;
Status Push(SqStack &S,char e){
    //插入元素e为新的栈顶元素
    if(S.top-S.base==S.stacksize)   //栈满
        return ERROR;
    *S.top++=e; //元素e压入栈顶,栈顶指针加1
    return OK;
}

//顺序栈的出栈
//算法步骤:
//1.判断栈是否为空,若空则返回ERROR;
//2.栈顶指针减1,栈顶元素出栈;
Status Pop(SqStack &S,char &e){
    //删除S的栈顶元素,用e返回其值
    if(S.base==S.top)
        return ERROR;   //栈空
    e=*--S.top; //栈顶指针减1,将栈顶元素赋值给e
    return OK;
}

//取顺序栈的栈顶元素
//算法步骤:
//判断栈是否为空,若不为空则将栈顶元素赋值给e,栈顶指针不需要改变;
//区别:出栈:取出栈顶元素,栈顶指针减1;取栈:取出栈顶元素,栈顶指针不需要减1;
Status GetTop(SqStack S,char &e){
    //返回S的栈顶元素,不修改栈顶元素
    if(S.base!=S.top){
        e=*(S.top-1);
        return OK;
    }
    return ERROR;
}

int main(){
    SqStack S;
    while(1){
        char tmp;
        int option=0;
        system("cls");
        cout<<"顺序栈的实现"<<endl;
        cout<<"1.顺序栈的初始化"<<endl;
        cout<<"2.顺序栈的入栈"<<endl;
        cout<<"3.顺序栈的出栈"<<endl;
        cout<<"4.取栈顶元素"<<endl;
        cout<<"0.退出"<<endl;
        cout<<"Please input number:";
        cin>>option;
        switch(option){
        case 1:
            if(InitStack(S)==OK)
                cout<<"1.Success!"<<endl;
            else
                cout<<"1.Error!"<<endl;
            system("pause");
            break;
        case 2:
            cout<<"Please input a elem:";
            cin>>tmp;
            if(Push(S,tmp)==OK)
                cout<<"2.Success!"<<endl;
            else
                cout<<"2.Error!"<<endl;
            system("pause");
            break;
        case 3:
            if(Pop(S,tmp)==OK){
                cout<<"3.Success!"<<endl;
                cout<<"The elem is "<<tmp<<"!"<<endl;
            }
            else
                cout<<"3.Error!"<<endl;
            system("pause");
            break;
        case 4:
            if(GetTop(S,tmp)==OK){
                cout<<"4.Success!"<<endl;
                cout<<"The elem is "<<tmp<<"!"<<endl;
            }
            else
                cout<<"4.Error!"<<endl;
            system("pause");
            break;
        case 0:
            exit(0);
            break;
        default:
            cout<<"Warming!Your input ERROR!"<<endl;
            break;
        }
    }
    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324774075&siteId=291194637