顺序栈的基本操作

顺序栈的基本操作

通过菜单调用各个操作,测试点:

  • 没有初始化前进行其他操作,程序是否能控制住;
  • 初始化一个栈;
  • 判栈空,屏幕显示栈为空;
  • 3个数入栈, 1、2、3;
  • 栈长度,屏幕输出3;
  • 取栈顶元素,再判栈空,然后再判栈长度。让学生知道取栈顶元素不改变栈中的内容,栈顶指针不发生改变;
  • 出栈,再判栈长度;
  • 销毁栈,再做其他操作,判断程序是否能控制;
  • 数制转换,输入:8,输出:1000

问题分析:

栈是将插入和删除集中在一端进行的线性结构,表尾端称为栈顶,表头端称为栈底,不含元素的栈称为空栈。

顺序栈是指利用顺序存储结构实现的栈,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,用指针top指向栈顶元素所在位置的下一位。

顺序栈有以下基本操作:初始化栈、销毁栈、将栈置空、入栈、出栈、判断栈是否为空、删除栈顶元素、求栈的长度、输出栈内元素、创建并初始化栈。

算法思想:

栈底指针base始终指向栈底的位置,当base的值为NULL时,百世栈不存在;top为栈顶指针,其初值指向栈底,每当元素入栈时,top指针加1,删除栈顶元素时,top指针减1;当栈为空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。

数制转换的算法思想:
将十进制数转换为n进制数,可每次将数除n的余数入栈,然后数除以n,直到该数变为0,再讲栈内元素输出,即可得到转换为n进制后的数。

源代码

#include <iostream>
#include <cmath>

using namespace std;
#define MAXSIZE 100
typedef int SElemType;
typedef struct{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

//初始化栈
int InitStack(SqStack&S)
{
    S.base=new SElemType[MAXSIZE];
    S.top=S.base;
    S.stacksize=MAXSIZE;
    return 1;
}
//判断栈是否为空
bool StackEmpty(SqStack S)
{
    if(S.top==S.base) return true;
    else return false;
}
//求顺序栈的长度
int StackLength(SqStack S)
{
    return S.top-S.base;
}
//清空顺序栈
int ClearStack(SqStack &S)
{
    if(S.base) S.top=S.base;
    return 1;
}
//销毁顺序栈
int DestroyStack(SqStack &S)
{
    if(S.base)
    {
        delete[]S.base;
        S.stacksize=0;
        S.base=S.top=NULL;
    }
    return 1;
}
//入栈
int Push(SqStack &S,SElemType e)
{
    if(S.top-S.base==S.stacksize)
        return 0;
    *S.top++=e;
    return 1;
}
//出栈
int Pop(SqStack &S,SElemType&e)
{
    if(S.top==S.base)
        return 0;
    e=*--S.top;
    return 1;
}
//取栈顶元素
int GetTop(SqStack S,SElemType&e)
{
    if(S.top==S.base) return 0;
    e=*(S.top-1);
    return 1;
}
//输出栈内元素
void print(SqStack S)
{
    while(S.top!=S.base)
    {
        cout<<*(S.top-1);
        S.top--;
    }
}
//创建并输入栈元素
void BulidStack(SqStack &S,int n)
{
    while(n--)
    {
        cin>>*S.top;
        S.top++;
    }
}
//输出提示信息
void welcome()
{
    cout<<"****************"<<endl;
    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;
    cout<<"10.创建并输入栈元素"<<endl;
    cout<<"11.退出"<<endl;
    cout<<"12.运行数字转换程序"<<endl;
    cout<<"****************"<<endl;
}
bool IsLegal(SqStack S)
{
    if(abs(S.top-S.base)>MAXSIZE)
        return false;
    else if(!S.base)
        return false;
    else
        return true;
}
int main()
{
    SqStack S;
    SElemType e;
    int n,mes;
//    cout<<*S.top<<" "<<*S.base;
//    return 0;
    welcome();
    cout<<"请输入你的选择>>";
    while(cin>>n)
    {
        switch(n)
        {
        case 1:
            mes=InitStack(S);
            if(mes)
                cout<<"初始化成功!"<<endl;
            break;
        case 2:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            mes=DestroyStack(S);
            if(mes)
                cout<<"销毁成功!"<<endl;
            break;
        case 3:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            mes=ClearStack(S);
            if(mes)
                cout<<"栈已置空!"<<endl;
            break;
        case 4:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            if(StackEmpty(S))
                cout<<"栈为空!"<<endl;
            else
                cout<<"非空!"<<endl;
            break;
        case 5:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            mes=StackLength(S);
            cout<<"栈的长度为:"<<mes<<endl;
            break;
        case 6:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            mes=GetTop(S,e);
            if(mes)
                cout<<"栈顶元素为:"<<e<<endl;
            else
                cout<<"操作失败!"<<endl;
            break;
        case 7:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            cout<<"请输入一个元素:";
            cin>>e;
            mes=Push(S,e);
            if(mes)
                cout<<"入栈成功!"<<endl;
            else
                cout<<"操作失败!"<<endl;
            break;
        case 8:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            mes=Pop(S,e);
            if(mes)
                cout<<"栈顶元素为:"<<e<<endl;
            else
                cout<<"操作失败!"<<endl;
            break;
        case 9:
            if(!IsLegal(S)){
                cout<<"栈未初始化!"<<endl;
                break;
            }
            print(S);
            cout<<endl;
            break;
        case 10:
            cout<<"请输入要初始化的元素个数:";
            cin>>mes;
            cout<<"请输入"<<mes<<"个元素:"<<endl;
            BulidStack(S,mes);
            break;
        case 11:
            return 0;
            break;
        case 12:
            cout<<"请输入要转换的数字:";
            cin>>e;
            InitStack(S);
            while(e)
            {
                Push(S,e%2);
                e/=2;
            }
            print(S);
            cout<<endl;
            break;
        default:
            cout<<"操作有误!"<<endl;
        }
        cout<<"请输入你的选择>>";
    }
    return 0;
}

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 11
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值