仅供参考!
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef int SElemType;
typedef struct{
int *base;//在栈结构之前和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
//Status是函数的类型。其值是函数结果状态代码
typedef int Status;
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASLBLE -1
#define OVERFLOW -2
Status InitStack(SqStack &S)
{
//构造一个空栈
S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if( !S.base )
exit(OVERFLOW);//储存分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}//初始化栈
Status DestoryStack(SqStack &S)
{
free(S.base);
S.base = NULL; //free后需要将指针赋NULL,否则可能造成问题
S.stacksize = 0;
return OK;
}//摧毁栈
Status ClearStack(SqStack &S)
{
S.top = S.base;
return OK;
}//清空一个栈
Status StackEmpty(SqStack S)
{
if ( S.base == S.top )
return TRUE;
return FALSE;
}//栈判空
int StackLength(SqStack S)
{
return S.top-S.base;
}//求栈的长度
Status GetTop(SqStack S, SElemType &e)
{
if ( S.top == S.base )
return ERROR;
e = *(S.top - 1);
return OK;
}//获得栈顶元素
Status Push(SqStack &S,SElemType e)
{
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize)
{
S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT) * sizeof(SElemType));
if( !S.base )
exit(OVERFLOW);//储存分配失败
S.top = S.base + S.stacksize;
}
*S.top++ =e;
}//插入一个元素
Status Pop(SqStack &S, SElemType &e)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if( S.top == S.base )
return ERROR;
e = *--S.top;
return OK;
}//删除一个元素
Status StackTraverse(SqStack S, Status(*visit)(SElemType*))
{
SElemType *pre;
pre = S.base;
while (!(pre == S.top))
{
if (!visit(pre)) //每有一个符合状态的,就进行输出判断
return ERROR;
pre++;
}
cout<<endl;
return OK;
}//对栈中元素进行遍历
int visit(SElemType *pre)
{
//显示元素值
cout <<*pre<<'\t';
return OK;
}
int conversion(int N,int n)
{
int result = 0,times = 0,e;
SqStack S;
InitStack(S);
while( N )
{
Push(S,N%n);
N/=n;
times++;//判断一下输进来的数是一个几位数
}
while( !StackEmpty(S) )
{
Pop(S,e);
for( int i = times;i > 1; i-- )// 根据位数来将出栈(进制转换)后的数字相加,得到结果
e *= 10;
result += e;
times --;
}
return result;
}//进制转换
int main()
{
int n,status;
SqStack S;
int len = 0;//标记栈的长度
int e = 0;//标记元素
S.base = NULL;
while( 1 )
{
cout<<""<<endl;
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<<"+------------------------+"<<endl;
cout<<"请输入要进行的操作:";
cin>>n;
if( n==11 )
break;
else if( n<1 || n>11 )
{
cout<<"请输入正确的功能选项!";
continue;
}
else
switch( n )
{
case 1:
InitStack(S);
cout<<"成功初始化一个栈!"<<endl;
break;
case 2:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不用进行摧毁操作!"<<endl;
break;
}
DestoryStack(S);
cout<<"栈已经被摧毁!"<<endl;
break;
case 3:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不能进行清空操作!"<<endl;
break;
}
if( S.base == S.top )
{
cout<<"栈为空,不需要进行清空操作!"<<endl;
break;
}
status = ClearStack(S);
cout<<"栈已经清空!"<<endl;
break;
case 4:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不能进行判空操作!"<<endl;
break;
}
status = StackEmpty(S);
if( status == TRUE )
cout<<"栈为空!"<<endl;
if( status == FALSE )
cout<<"栈不为空!"<<endl;
break;
case 5:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不能进行求长度操作!"<<endl;
break;
}
if( S.base == S.top )
{
cout<<"栈为空,长度为0"<<endl;
break;
}
len = StackLength(S);
cout<<"栈的长度为"<<len<<endl;
break;
case 6:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,无栈顶元素!"<<endl;
break;
}
if( S.base == S.top )
{
cout<<"栈为空,无栈顶元素!"<<endl;
break;
}
GetTop(S,e);
cout<<"栈顶元素为"<<e<<endl;
break;
case 7:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不能插入元素!"<<endl;
break;
}
cout<<"请输入要插入的元素的值:";
cin>>e;
Push(S,e);
cout<<"入栈操作已成功!"<<endl;
break;
case 8:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不能进行删除操作!"<<endl;
break;
}
if( S.base == S.top )
{
cout<<"栈为空,不能进行删除操作!"<<endl;
break;
}
status = Pop(S,e);
if( status == OK )
cout<<"一个元素已出栈!"<<endl<<"该元素是:"<<e<<endl;;
if( status == ERROR )
cout<<"栈为空,不能进行元素的删除!"<<endl;
break;
case 9:
if( S.base == NULL )
{
cout<<"栈已经被销毁或未初始化,不能遍历元素!"<<endl;
break;
}
if( S.base == S.top )
{
cout<<"栈为空,无元素!"<<endl;
break;
}
StackTraverse(S,visit);
break;
case 10:
int N,n,result;
cout<<"请输入一个十进制数进行进制转换:";
cin>>N;
cout<<"要进行几进制的转换:";
cin>>n;
result = conversion(N,n);
cout<<"进制转换的结果是:"<<"("<<result<<")"<<n<<endl;
break;
}
system("pause");
system("cls");
}
return 0;
}