本文已参与「新人创作礼」活动,一起开启掘金创作之路
关于栈的问题,首先我们要明白栈的有关定义:栈(stack)是一种只能在一端进行插入或者删除操作的线性表。下面我从栈的主要特点和分类来简要的为大家介绍什么是栈。
①栈的主要特点: 栈的主要特点就是后进先出,顾名思义,就是后面进栈的元素先出栈。拿生活中的例子来讲,相信你的印象会更加深刻,这就像你在家刷盘子,刷完盘子,将盘子摞在一起,最后洗完的盘子放在上面,当你有需要的时候,首先拿的就是最后洗完的盘子,也就是最上面的盘子。这就是后进先出在现实中所抽象出来的 “刷盘子”,当然现实中还有很多这种例子,比如 叠罗汉 、台球进洞后拿出来等等。仔细观察,你会发现程序世界,与现实世界息息相关。
由于栈中元素数据的逻辑关系呈线性关系,所以栈可以像线性表一样采用顺序存储结构和链式存储结构进行存储
下面通过一个题目,用两种存储结构来实现十进制转二进制的运算。
题目:
数制转换问题,要求:键盘输入一个十进制数,输出对应的二级制数。如:65 à 1000001B**(要求采用顺序栈、链栈分别实现。)**
顺序栈实现如下:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int top;
}SqStack;
//初始化顺序栈
void InitStack(SqStack *&s){
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
//进栈
bool Push(SqStack *&s,int e){
if(s->top==MaxSize-1)
return false; //栈满的情况下,返回false
while(e>0){
s->top++; //栈顶指针增1
s->data[s->top]=e%2; //元素e放在栈顶指针处
e=e/2;
}
return true;
}
//取栈中元素
bool GetEle(SqStack *s,int &e){
if(s->top==-1){
return false;
}
while(s->top!=-1){
e = s->data[s->top];//取栈顶元素
printf("%d",e);
s->top--;//栈顶指针减1
}
return true;
}
int main(){
SqStack *s;
int e;
printf("请输入您要转换的十进制整数:");
scanf("%d",&e);
InitStack(s);
Push(s,e);
GetEle(s,e);
}
链栈实现如下:
#include<stdio.h>
#include<malloc.h>
typedef struct linknode{
int data; //数据域
struct linknode *next; //指针域
}LinkNode;//链栈结点类型
//初始化栈
void InitStack(LinkNode *&s){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->next=NULL;
}
//进栈
void Push(LinkNode *&s,int e){
LinkNode *p;
p=(LinkNode *)malloc(sizeof(LinkNode)); //新建结点p
p->data = e; //存放元素e
p->next=s->next; //将p结点插入作为首节点
s->next = p;
}
//出栈
bool Pop(LinkNode *&s,int &e){
LinkNode *p;
if(s->next==NULL)
return false; //栈空返回false
p=s->next; //p指向首结点
e=p->data; //提取首结点值
s->next=p->next; //删除首结点
free(p); //释放被删结点的存储空间
return true;
}
int main(){
LinkNode *h;
int x;
int e;
int n;
printf("请输入您要转换的十进制整数:");
scanf("%d",&e);
InitStack(h);
while(e>0){
x=e%2;
Push(h,x);
e=e/2;
}
while(h->next!=NULL){
Pop(h,n);
printf("%d",n);
}
return 0;
}
作者:老6
qq:664474618
欢迎一起学习交流