顺序栈的基本操作
通过菜单调用各个操作,测试点:
- 没有初始化前进行其他操作,程序是否能控制住;
- 初始化一个栈;
- 判栈空,屏幕显示栈为空;
- 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;
}
运行结果