数据结构 ——栈

栈的应用


前言

主要是了解栈的运用


一、栈是什么?

限定仅在一端进行插入和删除操作的线性表

特点:先进后出

二、栈的运用?

1.十进制转化为二进制

代码如下(示例):

这个是手写的栈,可以直接调用库里面的函数, 创建Stack对象

#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef struct seqStack SeqStack;
typedef struct seqStack*  Stack;
struct seqStack{//顺序栈 
	DataType  *data;
	int maxsize;// 
	int top;//栈顶元素的下标 
	
};
Stack  StackInit(int n){
	Stack  ptrS = (Stack)malloc(sizeof(struct seqStack));
	ptrS->data = (DataType*)malloc(sizeof(DataType)*n) ;
	ptrS->maxsize = n;
	ptrS->top = -1;
	
	return ptrS;	
} 
void StackFree(Stack ptrS){	
	free(ptrS->data) ;free(ptrS) ;
} 
void Push(Stack ptrS,  DataType x){
     if (ptrS->top == ptrS->maxsize - 1) throw "上溢";
     ptrS->data[++ ptrS-> top] = x;
}
DataType Pop(Stack ptrS)
{     
       if (ptrS->top ==- 1)  throw "下溢";
       DataType  x = ptrS->data[ptrS->top];
       ptrS->top--;
       return x;
}
DataType GetTop(Stack ptrS){     
       if (ptrS->top ==- 1)  throw "下溢";
        return ptrS->data[ptrS-> top];
       
}

int StackEmpty(Stack ptrS){     
       
       return ptrS->top ==- 1;
}
int StackFull(Stack ptrS){     
       
       return ptrS->top ==ptrS->maxsize -1;
}

int StackLength(Stack ptrS){     
       return ptrS->top + 1;
       
}
void StackOutput(Stack ptrS){ 
       if(ptrS->top==-1){ printf("空栈\n"); return;} 
    
//       printf("\t\t栈顶\n"); 
       for(int i=ptrS->top;i>=0;i--){
//       	   	printf("\t\t%d\n",ptrS->data[i]);   
			printf("%d",ptrS->data[i]);     	
	   } 
//	   printf("栈底\n"); 
       
}


int main(){	

	int a; 
	printf("请输入十进制的整数") ;
	scanf("%d",&a) ;
	
	Stack ptrS=StackInit(10);
	
	
	while(a!=0){
		int b=a%2;
		Push(ptrS,b);
		a=a/2; 
	}
	
	StackOutput(ptrS);

}

2.括号匹配

代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef char DataType;
typedef struct seqStack SeqStack;
typedef struct seqStack*  Stack;
struct seqStack{//顺序栈 
	DataType  *data;
	int maxsize;// 
	int top;//栈顶元素的下标 
	
};
Stack  StackInit(int n){
	Stack  ptrS = (Stack)malloc(sizeof(struct seqStack));
	ptrS->data = (DataType*)malloc(sizeof(DataType)*n) ;
	ptrS->maxsize = n;
	ptrS->top = -1;
	
	return ptrS;
	
} 
void Push(Stack ptrS,  DataType x)
{
     if (ptrS->top == ptrS->maxsize - 1) throw "上溢";
     ptrS->data[++ ptrS-> top] = x;
}
DataType Pop(Stack ptrS)
{     
       if (ptrS->top ==- 1)  throw "下溢";
       DataType  x = ptrS->data[ptrS->top];
       ptrS->top--;
       return x;
}
DataType GetTop(Stack ptrS){     
       if (ptrS->top ==- 1)  throw "下溢";
        return ptrS->data[ptrS-> top];
       
}

int Empty(Stack ptrS){     
       
       return ptrS->top ==- 1;
}

int StackLength(Stack ptrS){     
       return ptrS->top + 1;
       
}

int main(){	
   Stack ptrS;
   ptrS = StackInit(100);
   char exp[100];
   scanf("%s",exp);//5 + ( (3 + 2) ×(8 – 7) ÷ 3
   for(int i=0;exp[i]!='\0';i++){
   	  if(exp[i]=='('||exp[i]=='['||exp[i]=='{') Push(ptrS,'(');
   	  else if(exp[i]==')'){
   	        if(Empty(ptrS)==1){
   	            printf("配对不成功\n"); 
				return 0;	
			}
			if(GetTop(ptrS) !='('){
				printf("配对不成功\n"); 
				return 0;
			}
			Pop(ptrS);	
	  }
	   else if(exp[i]==']'){
   	         if(Empty(ptrS)==1){
   	            printf("配对不成功\n"); 
				return 0;	
			}
			if(GetTop(ptrS) !=']'){
				printf("配对不成功\n"); 
				return 0;
			}
			Pop(ptrS);	
	  }
	   else if(exp[i]=='}'){
   	         if(Empty(ptrS)==1){
   	            printf("配对不成功\n"); 
				return 0;	
			}
			if(GetTop(ptrS) !='}'){
				printf("配对不成功\n"); 
				return 0;
			}
			Pop(ptrS);		
	  }
   	
   }
     
   if(Empty(ptrS)==1) 
      printf("成功 配对\n");
   else  	
      printf("左括号多了,右括号少了\n") ;
}


总结

本节是对于数据结构中的栈的主要的作用的总结,其实还有很多作用的。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聪明快乐的小智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值