这个Joseph的顺序栈一点也不好吃

基于数组而实现的顺序栈

栈(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值