基于数组而实现的顺序栈
栈(Stack)是限定只能在表尾进行插入和删除操作的线性表。
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
缺点:需要事先确定好储存空间大小
顺序栈的结构体
typedef struct SqStack
{
ElemType *elem; //指向数组
int top; //用于记录栈顶的下标
int size; //栈的最大空间
}SqStack;
所有函数
显示菜单
void menu0(){
printf("\n\n\n\n\t\t\t| |\n");
printf("\t\t\t| 顺序栈不好吃 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 1.初始化一下啊 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 2.栈是空的吗? |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 3.看看栈顶元素 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 4.清空栈 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 5.销毁栈 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 6.检测栈的长度 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 7.入栈 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 8.出栈 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 9.查看当前栈的情况 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 10.Quit |\n");
printf("\t\t\t| |\n");
printf("\n\t\t\nPlease enter your choice(1 to 10) :\n");
}
初始化栈
Status initStack(SqStack *s,int sizes){//初始化栈
int i;
s->size = sizes;
s->top = -1;
if(s == NULL)return ERROR;
else{
printf("请输入int型数据放入顺序栈中(输入非法字符以结束)\n");
int *a;
a =(ElemType *)malloc(sizes*sizeof(ElemType *));
s->elem=a;
for(i=0 ; i < sizes ; i++){
int num;
printf("\n第%d个数据:",i+1);
int x = scanf("%d",&num);
if(x == 1){
*(s->elem+i) = num;
}
else if(x !=1 && i == 0){
printf("你输入的第一个数据不是int型,初始化结束,这是一个空栈!\n");
s->top = -1;//-1是空栈的标志
system("pause");
return SUCCESS;
}
else{
printf("初始化已结束,现在顺序栈中有%d个数据\n",i);
s->top = i-1;
system("pause");
break;
}
}
s->top = i-1;//栈顶的位置
system("cls");
getchar();
printf("当前顺序栈中的数据如下\n\n");
printf("位置| 数据 |\n");
for(i = s->top ; i>=0 ; i--){
printf(" %d | %d |\n",i,s->elem[i]);
printf("-----------------------\n");
}
system("pause");
return SUCCESS;
}
}
判断是否为空栈或没初始化
Status isEmptyStack(SqStack *s){//判断栈是否为空
if(s->elem == NULL){
printf("栈未初始化!!!\n");
system("pause");
return ERROR;
}
else if(s->top == -1){
printf("这是一个空栈!\n");
system("pause");
return ERROR;
}
else{
printf("这个栈不是空的,这是一个好栈\n");
system("pause");
return SUCCESS;
}
return SUCCESS;
};
获取栈顶的元素
Status getTopStack(SqStack *s,ElemType *e){//得到栈顶元素
if(s->top == -1){
*e = '\0';
return ERROR;
}
else{
*e = s->elem[s->top] ;
return SUCCESS;
}
};
Status clearStack(SqStack *s){//清空栈
int i ;
for( i = 0 ; i<s->size;i++){
*(s->elem+i) = '\0';
}
s->top=-1;
return 0;
};
清空栈
Status clearStack(SqStack *s){//清空栈
int i ;
for( i = 0 ; i<s->size;i++){
*(s->elem+i) = '\0';
}
s->top=-1;
return 0;
};
销毁栈
Status destroyStack(SqStack *s){//销毁栈
s->elem = NULL;
s->size = 0;
s = NULL;
};
检测栈的长度
Status stackLength(SqStack *s,int *length){//检测栈长度
int i ;
if(s->elem == NULL){
printf("暂未初始化栈,请先初始化!\n");
system("pause");
return ERROR;
}
else{
for( i = 0; *(s->elem+i)!='\0'; i++){}
*length = i;
printf("\n当前栈的长度为 %d\n ",*length);
system("pause");
return SUCCESS;
}
};
入栈
Status pushStack(SqStack *s,ElemType data){//入栈
if(s->top+1 >= s->size){
printf("这个栈已经满了,无法再存入数据!\n");
system("pause");
return ERROR;
}
else{
s->top++;
*(s->elem+s->top) = data;
printf("入栈成功!现在的栈顶位置%d存的是%d",s->top,data);
system("pause");
return SUCCESS;
}
};
出栈
Status popStack(SqStack *s,ElemType *data){//出栈
if(s->top == -1){
printf("这是一个空栈,没有能出栈的数据\n");
system("pause");
return ERROR;
}
else{
*data = *(s->elem+s->top);
s->top--;
return SUCCESS;
}
};
显示栈的数据
Status visits(ElemType data)
{
printf("| %d |\n",data);
printf("-----------------------\n");
return SUCCESS;
}
Status StackTraverse(SqStack *s)
{
if(s->elem == NULL){
printf("栈未初始化\n");
system("pause");
return ERROR;
}
else if(s->top == -1){
printf("这是一个长度为%d空栈,内部暂无数据",s->size);
system("pause");
return ERROR;
}
int i = s->top;
system("cls");
printf("这里是栈顶↓\n");
while(1)
{
visits(s->elem[i--]);
if(i == -1)break;
}
system("pause");
printf("\n");
return SUCCESS;
}
主函数
int main(){
int select;
SqStack* q = NULL;
q = (SqStack*) malloc(sizeof(struct SqStack));
q->elem = NULL;
while(1){
fflush(stdin);
system("cls");
menu0();
scanf("%d",&select);
switch(select){
int info , length;
//1.栈的初始化
case 1 :{
system("cls");
printf("请输入栈的最大空间:");
int x = scanf("%d",&length);
//判断输入是否为int型数据
if(x == 1 && length > 0){
initStack(q,length);
system("pause");
}
else{
printf("请输入大于0的数字!\n");
system("pause");
continue;
}
break;
}
//2.查看是否为空栈
case 2 :{
isEmptyStack(q);
break;
}
//3.得到当前的栈顶元素
case 3 :{
ElemType topnum;
if(q->elem!=NULL){
getTopStack(q,&topnum);
if(topnum == '\0'){
printf("当前为空栈!\n");
system("pause");
}
else{
printf("栈顶的位置是%d\n",q->top);
printf("\n当前栈顶的元素为%d",topnum);
system("pause");
}
}
else{
printf("暂未初始化栈,请先初始化!\n");
system("pause");
}
break;
}
//4.清空当前的栈内数据
case 4:{
clearStack(q);
printf("栈内的数据已清空了!\n");
system("pause");
break;
}
//5.销毁当前的栈
case 5 :{
destroyStack(q);
printf("栈已被销毁,请进行初始化\n");
system("pause");
break;
}
//6.检测当前栈的长度
case 6 :{
int newlength;
stackLength(q,&newlength);
break;
}
//7.入栈
case 7 :{
ElemType data;
if(q->elem != NULL){
system("cls");
printf("请输入即将入栈的数据:");
int x = scanf("%d",&data);
if(x == 1){
pushStack(q,data);
}
else{
printf("*****警告,请输入int型数据*****\n");
system("pause");
continue;
}
}
else{
printf("暂未初始化栈,请先初始化!\n");
system("pause");
}
break;
}
//8.出栈
case 8 :{
ElemType outnum;
if(q->elem!=NULL){
popStack(q,&outnum);
}
else{
printf("暂未初始化栈,请先初始化!\n");
system("pause");
}
break;
}
//查看当前栈内的数据
case 9 :{
StackTraverse(q);
break;
}
//退出
case 10:{
printf("感谢您使用Joseph的顺序栈^O^\n") ;
system("pause");
return 0;
}
default:break;
}
}
return 0;
}