首先栈是一个先进后出或者说后进先出的限制性数据结构,并且用代码实现有顺序表和线性表两种方式,我的代码采用了顺序结构存储的方式,即首先在内存中申请一块空间,通过top和base两指针的状态进行基本增删改查操作,另附实验报告并对代码有详细的解读,如有需要可以发邮件给我,邮箱在基本资料中(如邮件未及时回复请谅解)
本代码注重对于程序健壮性的解读,其中的一些条件判断是巩固程序健壮性的,而判断中的代码则是实现的核心代码
#include <iostream>
#include <stdlib.h>
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
#define TRUE 1
#define FALSE 0
#define ERROR -1
typedef int SElemType;
typedef int Status;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
using namespace std;
void title();
Status InitStack(SqStack &S);//创建
Status DestroyStack(SqStack &S);//销毁
Status ClearStack(SqStack &S);//清空
Status StackEmpty(SqStack S);//判空
Status Stacklength(SqStack S);//长度
Status GetTop(SqStack S);//获取最头元素
Status Push(SqStack &S,SElemType e);//插入头元素
Status Pop(SqStack &S);//删除最头元素
Status StackTraverse(SqStack S);//元素遍历
Status CreatStack(SqStack &S,int len);//插入一组元素
int main()
{
title();
int opt=0;
cout<<"请输入操作序号:"<<endl;
cin>>opt;
SqStack S;
S.base = NULL;
int ads = 0;
while(opt!=0){
ads = 0;
switch(opt){
case 1:
InitStack(S);
break;
case 2:
DestroyStack(S);
break;
case 3:
ClearStack(S);
break;
case 4:
StackEmpty(S);
break;
case 5:
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
break;
}
ads = Stacklength(S);
cout<<"栈的长度为:"<<ads<<endl;
break;
case 6:
GetTop(S);
break;
case 7:
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
break;
}
int num;
cout<<"请输入需要插入的数:"<<endl;
cin>>num;
Push(S,num);
break;
case 8:
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
break;
}
if(S.base==S.top){
cout<<"为空表,无元素可以删除!"<<endl;
break;
}
ads = Pop(S);
cout<<"返回删除的元素是"<<ads<<endl;
break;
case 9:
StackTraverse(S);
break;
case 10:
{
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
break;
}
int hj=0;
cout<<"请输入插入元素的个数:"<<endl;
cin>>hj;
CreatStack(S,hj);
break;
}
case 11:
ads = ten_two(S);
break;
default:
cout<<"输入有误!"<<endl;
}
cout<<"*请输入操作序号:*"<<endl;
cin>>opt;
}
return 0;
}
void title(){
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<<"****** 0.退出 ******"<<endl;
cout<<"*********************************************"<<endl;
}
Status InitStack(SqStack &S){
if(S.base!=NULL){
cout<<"栈已存在!"<<endl;
return FALSE;
}
S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base){
cout<<"申请内存空间失败!"<<endl;
exit(ERROR);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
cout<<"创建栈成功!"<<endl;
return TRUE;
}
Status DestroyStack(SqStack &S){
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
return FALSE;
}
free(S.base);
S.base = NULL;
S.top = NULL;
cout<<"清空栈成功!"<<endl;
return TRUE;
}
Status ClearStack(SqStack &S){
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
return FALSE;
}
S.top = S.base;
cout<<"栈已经清空!"<<endl;
return TRUE;
}
Status StackEmpty(SqStack S){
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
return FALSE;
}
if(S.top==S.base){
cout<<"这是一个空栈!"<<endl;
}
else{
cout<<"栈中有元素!"<<endl;
}
return TRUE;
}
Status Stacklength(SqStack S){
int len=0;
len = S.top-S.base;
return len;
}
Status GetTop(SqStack S){
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
return FALSE;
}
if(S.top==S.base){
cout<<"这是一个空栈!"<<endl;
return FALSE;
}
else{
cout<<"栈顶元素为:"<<*(S.top-1)<<endl;
}
}
Status Push(SqStack &S,SElemType e){
if(S.top-S.base>=S.stacksize){
S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base){
cout<<"申请内存空间失败!"<<endl;
exit(ERROR);
}
S.top = S.base + S.stacksize;
S.stacksize = S.stacksize + STACKINCREMENT;
}
*S.top = e;
S.top++;
return TRUE;
}
Status Pop(SqStack &S){
int e = 0;
e = *(S.top-1);
S.top--;
return e;
}
Status StackTraverse(SqStack S){
if(S.base==NULL){
cout<<"栈不存在!"<<endl;
return FALSE;
}
if(S.base==S.top){
cout<<"这是一个空表"<<endl;
}
else{
cout<<"栈内元素(由栈底到栈顶)为:"<<endl;
while(S.top>S.base){
cout<<*(S.base++)<<" ";
}
cout<<endl;
}
return TRUE;
}
Status CreatStack(SqStack &S,int len){
int k = 1;
if((S.top-S.base)+len-1>=S.stacksize){
k = (len/STACKINCREMENT)+1;
S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT*k)*sizeof(SElemType));
if(!S.base){
cout<<"申请内存空间失败!"<<endl;
exit(ERROR);
}
S.stacksize = S.stacksize + STACKINCREMENT*k;
}
cout<<"输入"<<len<<"个元素:";
int num = 0;
for(int i=1;i<=len;i++){
cin>>num;
*(S.top) = num;
S.top++;
}
cout<<"插入元素成功!"<<endl;
return TRUE;
}