数据结构 第4次上机实验 顺序栈的基本操作

数据结构 第4次上机实验 顺序栈的基本操作

实验内容

实验5、顺序栈的基本操作 (2学时)
(1)实验目的
通过该实验,让学生掌握栈的相关基本概念,认识栈是插入和删除集中在一端进行的线性结构,掌握栈的“先入后出”操作特点。栈在进行各类操作时,栈底指针固定不动,掌握栈空、栈满的判断条件。
(2)实验内容
用顺序存储结构,实现教材定义的栈的基本操作,提供数制转换功能,将输入的十进制整数转换成二进制。
(3)参考界面
在这里插入图片描述

(4)验收/测试用例
通过菜单调用各个操作,测试点:
 没有初始化前进行其他操作,程序是否能控制住;
 初始化一个栈;
 判栈空,屏幕显示栈为空;
 3个数入栈, 1、2、3;
 栈长度,屏幕输出3;
 取栈顶元素,再判栈空,然后再判栈长度。让学生知道取栈顶元素不改变栈中的内容,栈顶指针不发生改变;
 出栈,再判栈长度;
 销毁栈,再做其他操作,判断程序是否能控制;
 数制转换,输入:8,输出:100

源码粘贴

//实验4.顺序栈的基本操作
#include<iostream>
#include<stdio.h>
#include<cstdlib>
using namespace std;

#define MaxSize 100
bool cotinuedo;//标记顺序栈是否初始化

//定义顺序栈
struct SqStack
{
    
    
    int *base;//栈底指针
    int *top;//栈顶指针
    int stacksize;//栈可用的最大容量
};

void xianshi()
{
    
    
    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;
    cout << "请输入选择:" << endl;
}

//1.初始化空栈
bool InitStack( SqStack &S )
{
    
    
    //构造一个空栈
    S.base = new int[MaxSize];

    //如果内存分配失败
    if( !S.base )
    {
    
    
        cout << "栈的内存分配失败!" << endl;
        return false;
    }

    S.top = S.base; //栈顶指针初始化为base,空栈
    S.stacksize = MaxSize; //stacksize设置为栈的最大容量MaxSize
    cout << "栈的内存分配成功,初始化成功!" << endl;
    return true;
}

//2.销毁栈
bool DestroyStack( SqStack &S )
{
    
    
    if( S.base )
    {
    
    
        delete []S.base;
        S.top = S.base = NULL;
        S.stacksize = 0;
        cout << "顺序栈销毁成功!" << endl;
        return true;
    }

}

//3.将栈置空
bool ClearStack( SqStack &S )
{
    
    
    if( S.base )
    {
    
    
        S.top = S.base;
        //cout << "栈置空成功! "<< endl;
        return true;
    }
    else
    {
    
    
        return false;
    }

}

//4.判断栈是否为空
bool EmptyStack( SqStack S )
{
    
    

    if( S.top == S.base )
    {
    
    
        //cout << "顺序栈为空!" << endl;
        return true;
    }
    else
    {
    
    
        //cout << "顺序栈非空!" << endl;
        return false;
    }


}

//5.返回栈的长度
void LenStack( SqStack S, int &length )
{
    
    
    if( S.base )
        length = S.top - S.base;

}

//6.求栈顶元素
bool GetTop( SqStack S, int &e )
{
    
    
    //返回栈顶元素,不修改栈顶指针
    if( EmptyStack( S ) )//栈空
    {
    
    
        cout << "栈空,求栈顶元素失败!" << endl;
        return false;
    }
    e = *(S.top-1);
    printf("栈顶元素为%d\n", e);
    return true;
}

//7.插入元素,并使其成为栈顶元素
bool PushStack( SqStack &S, int e )
{
    
    
    //插入元素e,并使其成为栈顶元素
    if ( S.top - S.base >= S.stacksize )//栈满
    {
    
    
        cout << "栈满,无法插入新元素!" << endl;
        return false;
    }
    *S.top++ = e;//*S.top = e;赋值 S.top++;自增
    //printf("元素%d插入成功!", e);
    return true;
}

//8.删除栈顶元素,并返回其值
bool PopStack( SqStack &S, int &e )
{
    
    
    //删除栈顶元素,并且用e返回其值
    if( EmptyStack( S ) )//栈空
    {
    
    
        cout << "栈空,删除栈顶元素失败!" << endl;
        return false;
    }

    e = *--S.top;
    printf("栈顶元素%d删除成功!", e);
    return true;
}
//9.输出栈内元素
bool PrintStack ( SqStack S )
{
    
    
    if( EmptyStack( S ) )//栈空
    {
    
    
        cout << "栈空,无法输出栈内元素!" << endl;
        return false;
    }
    else
    {
    
    
        for( int *i=S.top-1; i>=S.base; i-- )
        {
    
    
            cout << *i << ' ';
        }
        cout << endl;
        return false;
    }
}
//10.创建并输入栈元素
bool ScanfStack( SqStack &S )
{
    
    
    //判断栈满
    if ( S.top - S.base >= S.stacksize )//栈满
    {
    
    
        cout << "栈满,无法插入新元素!" << endl;
        return false;
    }

    //输出栈的空余位置
    //int remain_stacksize = (int)(S.stacksize-S.top-S.base);
    //cout << "栈中空余的位置为:" << remain_stacksize << endl;

    //输入元素个数
    cout << "请输入入栈元素个数:" << endl;
    int n;
    cin >> n;

    //if( n > remain_stacksize )
    //{
    
    
    //   cout << "元素个数不合法!" << endl;
    //   return false;
    //}
    //else
    //{
    
    
    printf("请输入%d个元素:\n", n);
    //输入元素,并使其入栈
    while( n-- )
    {
    
    
        int num;
        cin >> num;
        PushStack( S, num );
    }
    cout << "入栈完毕!" << endl;
    return true;
    //}
}

//11.栈的进制转换
void ConvertStack( SqStack &S, int value, int binary )
{
    
    
    int digit[2] = {
    
     0, 1 };

    ClearStack( S );

    do
    {
    
    
        PushStack( S, digit[value % binary] );
    }
    while( value /= binary);

    PrintStack( S );
    cout << endl;
}

//12.退出
void Exit( )
{
    
    
    cout << "操作结束!退出成功!" << endl;
}

void Menu()
{
    
    
    int operate_num;
    //SqStack s[100];
    //int i=1, booki;
    SqStack s;
    while( 1 )
    {
    
    
        cin >> operate_num;

        switch( operate_num )
        {
    
    
        case 1 ://初始化栈
        {
    
    
            InitStack( s );
            cotinuedo = true;
            break;

        }//case1
        case 2:// 2.销毁栈
        {
    
    
            if( cotinuedo )
            {
    
    
                DestroyStack( s );
                cotinuedo = false;
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法销毁!" <<endl;
            }
            break;
        }//case2
        case 3://3.将栈置空
        {
    
    
            if( cotinuedo )
            {
    
    
                if( ClearStack( s ) )
                {
    
    
                    cout << "顺序栈置空成功!" << endl;
                }
                else
                {
    
    
                    cout << "顺序栈置空失败!" << endl;
                }
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法置空!" <<endl;
            }
            break;
        }//case 3
        case 4://4.判断栈是否为空
        {
    
    
            if( cotinuedo )
            {
    
    
                if( EmptyStack( s ) )
                {
    
    
                    cout << "顺序栈为空!" << endl;
                }
                else
                {
    
    
                    cout << "顺序栈非空!" << endl;
                }
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法置空!" <<endl;
            }
            break;
        }//case 4
        case 5://5.返回栈的长度
        {
    
    
            if( cotinuedo )
            {
    
    
                int length;
                LenStack( s, length );
                cout << "顺序栈的长度为:" << length << endl;
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法返回长度!" <<endl;
            }
            break;
        }//case 5
        case 6://6.求栈顶元素
        {
    
    
            if( cotinuedo )
            {
    
    
                int e;
                GetTop( s, e );
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法求栈顶元素!" <<endl;
            }
            break;
        }//case 6
        case 7://7.插入元素,并使其成为栈顶元素
        {
    
    
            if( cotinuedo )
            {
    
    


                int e;
                PopStack( s, e );
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法插入元素!" <<endl;
            }
            break;
        }//case 7
        case 8://8.删除栈顶元素,并返回其值
        {
    
    
            if( cotinuedo )
            {
    
    
                int e;
                PopStack( s, e );
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法删除栈顶元素!" <<endl;
            }
            break;
        }//case 8
        case 9://9.输出栈内元素
        {
    
    
            if( cotinuedo )
            {
    
    
                int e;
                cout << "栈内元素为:" << endl;
                PrintStack( s );
                cout << "栈内元素输出完毕!" << endl;
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法输出栈内元素!" <<endl;
            }
            break;
        }//case9
        case 10://10.创建并输入栈元素
        {
    
    
            if( cotinuedo )
            {
    
    
                ScanfStack( s );
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法创建并输入栈元素!" <<endl;
            }
            break;
        }//case 10
        case 11 :
        {
    
    
            if( cotinuedo )
            {
    
    
                int value;
                cout << "请输入一个十进制数:" << endl;
                cin >> value;
                ConvertStack( s, value, 2 );
            }
            else
            {
    
    
                cout << "顺序栈没有初始化,无法进行进制转换!" << endl;
            }
            break;
        }
        case 12://11.退出
        {
    
    
            Exit();
            exit(0);
            break;
        }//cse11
        default:
        {
    
    
            cout << "操作数输入有误!" << endl;
            cout << "请重新输入:" << endl;
            break;
        }

        }
    }
}

int main()
{
    
    
    xianshi();
    Menu();
    return 0;
}

学习总结

  1. 在子函数中退出主程序,可以使用cstdlib库下的exit(0)。其效果与main函数中的return 0效果一致。

猜你喜欢

转载自blog.csdn.net/m0_46161051/article/details/115689171