实验内容
实验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;
}
学习总结
- 在子函数中退出主程序,可以使用cstdlib库下的exit(0)。其效果与main函数中的return 0效果一致。