栈的基本操作的实现(顺序栈)

#include <iostream>
#include <malloc.h>
#define STACK_INIT_LENGTH 100    //栈初始化容量
#define STACK_ADD 20                       //扩栈增量
#define OK 1
#define ERROR -1
using namespace std;
//栈和树
/* 栈的基本功能的实现:
        1.栈的初始化
        2.栈中元素初始化
        3.入栈(每次一个元素)
        4.出栈(每次一个元素)
        5.按出栈顺序显示当前栈中元素
        6.反出栈顺序显示当前栈中元素
        7.清空栈(清空元素)
        8.销毁栈(清除内存)*/
typedef  int  status;             //定义函数返回状态
typedef  int  Elemtype;       //栈中元素类型均为int
struct Stack                          //栈结构体
{
    Elemtype *base;    //栈底指针
    Elemtype *top;      //栈顶指针
    int Stack_NowLength;     //实时栈总容量
    int Mark;                 //记录栈顶指针位置 -1表示没有栈中没有元素
};

status Init_Stack(struct Stack &S)    //1.初始化栈
{
    S.base = (Elemtype *)malloc(sizeof(Elemtype)*STACK_INIT_LENGTH);   //采用malloc的方式分配内存
    if(S.base == NULL)
    {
        cout<<"初始化失败!"<<endl;
        return ERROR;
    }
    S.top = S.base;
    S.Stack_NowLength = STACK_INIT_LENGTH;
    S.Mark = 0;
    cout<<"初始化成功!"<<endl;
    return OK;
}

status InitEle_Stack(struct Stack &S)  //2.栈中元素初始化
{
    if(S.base != S.top)
    {
        cout<<"栈不为空"<<endl;
        return ERROR;
    }
    int n;
    cout<<"请输入初始时栈中元素个数(小于100):"<<endl;  //规定初始时元素个数小于初始时栈的容量
    cin>>n;
    for(int i = 0;i<n;i++)
    {
        cout<<"请输入第"<<i+1<<"个元素的值"<<endl;
        cin>>*(S.top);
         S.top++;
        S.Mark++;
    }                                                                               //初始化后S.top指向栈顶元素的后一位
    cout<<"栈中元素初始化完成!"<<endl;
    return OK;
}

status Push_Stack(struct Stack &S)  //3.入栈
{
    if(S.top - S.base == S.Stack_NowLength+1)  //判断栈满 由于每次入栈都是一个元素 所以条件直接写成判断等于就可以
    {
        S.base = (Elemtype*) realloc( S.base,(S.Stack_NowLength +STACK_ADD )* sizeof (Elemtype));    //若栈满,用realloc扩栈
        if(S.base == NULL)
        {
            cout<<"扩栈失败!"<<endl;
            return ERROR;
        }
        S.Stack_NowLength += STACK_ADD;
        S.top = S.base+S.Stack_NowLength;
        cout<<"扩栈成功!"<<endl;
    }
    cout<<"请输入入栈元素:"<<endl;
    cin>>*(S.top);
    S.top++;
    cout<<"入栈成功!"<<endl;
    return OK;
}

status Pop_Stack(struct Stack &S)  //4.出栈(仅显示出栈的值,不返回出栈值)
{
    S.top--;
    if(S.top == NULL)
    {
        cout<<"栈为空!"<<endl;
        return ERROR;
    }
    cout<<"出栈元素为:"<<*(S.top)<<endl;
    return OK;
}

status PoDisplay_Stack(struct Stack &S)  //5.按出栈顺序显示当前栈中元素
{
    if(S.top == S.base)
    {
        cout<<"栈为空!"<<endl;
        return ERROR;
    }
    cout<<"按出栈顺序显示当前栈中元素为:"<<endl;
    Elemtype *p = NULL;
    p = S.top;
    p--;
    while(p != S.base-1)
    {
        cout<<*p<<endl;
        p--;
    }
    return OK;
}

status NeDisplay_Stack(struct Stack &S)  //6.反出栈顺序显示当前栈中元素
{
    if(S.top ==S.base)
    {
        cout<<"栈为空!"<<endl;
        return ERROR;
    }
    cout<<"反出栈顺序显示当前栈中元素为:"<<endl;
    Elemtype *p = NULL;
    p = S.base;
    while(p != S.top)        //S.top始终指向的就是栈顶元素的下一位
    {
        cout<<*p<<endl;
        p++;
    }
    return OK;
}

status Clear_Stack(struct Stack &S)    //7.清空栈
{
    S.top=S.base;
    cout<<"栈已清空!"<<endl;
    return OK;
}

status Destroy_Stack(struct Stack &S)    //8.销毁栈
{
    free(S.base);
    S.top = S.base;
    S.base = NULL;
    S.top = NULL;
    S.Stack_NowLength = 0;
    cout<<"栈已销毁!"<<endl;
    return OK;
}
int main()
{
    struct Stack S;
    int i = 1,n;
    cout<<"首次进入请初始化栈!"<<endl;
    while(i!=0)
    {
        cout<<"1  初始化栈"<<endl;
        cout<<"2  栈中元素初始化"<<endl;
        cout<<"3  入栈(每次一个元素)"<<endl;
        cout<<"4. 出栈(每次一个元素)"<<endl;
        cout<<"5  按出栈顺序显示当前栈中元素"<<endl;
        cout<<"6  反出栈顺序显示当前栈中元素"<<endl;
        cout<<"7  清空栈"<<endl;
        cout<<"8  销毁栈"<<endl;
        cout<<"9  退出"<<endl;
        cin>>n;
        switch(n)
         {
             case 1 :
                 Init_Stack(S);
                 break;
             case 2 :
                  InitEle_Stack(S);
                 break;
             case 3 :
                 Push_Stack(S);
                 break;
             case 4 :
                  Pop_Stack(S);
                 break;
             case 5 :
                 PoDisplay_Stack(S);
                 break;
            case 6 :
                 NeDisplay_Stack(S);
                 break;
            case 7 :
                Clear_Stack(S);
                break;
            case 8 :
                 Destroy_Stack(S);
                 break;
            case 9:
                 i = 0;
                 break;
            default :
                 cout<<"请重新输入"<<endl;
         }
         system("pause");
         system("cls");
    }
    return 0;
}

实现界面:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值