栈的应用
前言
主要是了解栈的运用
一、栈是什么?
限定仅在一端进行插入和删除操作的线性表
特点:先进后出
二、栈的运用?
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") ;
}
总结
本节是对于数据结构中的栈的主要的作用的总结,其实还有很多作用的。