一文看懂栈

继续数据库的学习,今天的主题是栈,但是今天我想换一种新的方式,用一道题,用实际操作来熟悉栈。

请听题:使用栈,实现10进制到8进制的转换。

    例如:(1348)10 = (2054)8

首先解决的问题是如何实现进制转换。现取一整数n,每次将整数部分除以8,余数为该位权上的数,而商继续除以8,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数起,一直到最前面的一个余数。来张图会看的清楚点,大家应该都非常熟悉啦,我这些有点废话啦。 

那剩下的就是今天的主线问题啦,栈。栈也是线性表的一种,不过它是受到限制的线性表,只允许在表尾进行插入和删除操作。允许插入和删除的一段是栈顶,另一端是栈底。如果栈中不包含任何元素,那么这个栈就是空栈。栈中元素的一大特性就是“先进后出”,送你道题,帮助你理解什么是先进后出。

一个栈的输入序列为1,2,3,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么?

 答:    可以通过穷举所有可能性来求解:

            ① 1入1出, 2入2出,3入3出, 即123;

            ② 1入1出, 2、3入,3、2出, 即132;

            ③ 1、2入,2出, 3入3出,    即231;

            ④ 1、2入,2、1出,3入3出,  即213;

            ⑤ 1、2、3入,3、2、1出,    即321;

                合计有5种可能性。

怎么样是不是很简单啊!这些都懂了,那来看看代码吧。

结构定义

typedef struct Node{  int data;  struct Node * next;}NODE,*PNODE;typedef struct Stack{  PNODE top;//栈顶  PNODE base;//栈底 }STACK,*PSTACK;

初始化栈

void Init(PSTACK PS) {   PS->top=(PNODE)malloc(sizeof(NODE));//分配存储空间   if(PS->top==NULL)   {     printf("存储分配失败!");     exit(-1);   }   PS->base=PS->top;   PS->top->next =NULL;}

入栈

假设元素值为x的新结点是p

第一步把top的指针给p

第二步让top指向p

void Push(PSTACK PS,int val){  PNODE Pnew=(PNODE)malloc(sizeof(NODE));   if(Pnew==NULL)   {     printf("存储分配失败!");     exit(-1);   }   Pnew->data=val;   Pnew->next=PS->top;   PS->top=Pnew; }

出栈

出栈操作跟入栈操作刚好相反

第一步把q的指针交给top

第二步释放q

bool Empty(PSTACK PS){  if(PS->top == PS->base)    return true;  return false;}bool Pop(PSTACK PS,int *val){  if(Empty(PS))  {    printf("栈为空,出栈失败!");    return false;  }  else  {    PNODE P=PS->top;    *val = P->data;    PS->top=P->next;    free(P);    return true;  }}

输出

输出是需要判断栈是否为空,栈为空的条件是P->top=P->base

void Traverse(PSTACK PS){  PNODE P=PS->top;  while(P!=PS->base)  {    printf("%d ",P->data);    P=P->next;  }  printf("\n");}

进制转换的实现

实现部分主要是使用栈存放每次做除法运算得到的余数

{  int n,val;  printf("请输入一个十进制数值:");  scanf("%d",&n);   STACK S;  Init(&S);  while(n!=0)  {    int t=n%8;    Push(&S,t);    n=n/8;  }  while(!Empty(&S))  {    Pop(&S,&val);    printf("%d ",val);  }  return 0;}

全部代码

#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct Node{  int data;  struct Node * next;}NODE,*PNODE;typedef struct Stack{  PNODE top;  PNODE base; }STACK,*PSTACK; void Init(PSTACK PS){   PS->top=(PNODE)malloc(sizeof(NODE));   if(PS->top==NULL)   {     printf("存储分配失败!");     exit(-1);   }   PS->base=PS->top;   PS->top->next =NULL;}void Push(PSTACK PS,int val){  PNODE Pnew=(PNODE)malloc(sizeof(NODE));   if(Pnew==NULL)   {     printf("存储分配失败!");     exit(-1);   }   Pnew->data=val;   Pnew->next=PS->top;   PS->top=Pnew; }void Traverse(PSTACK PS){  PNODE P=PS->top;  while(P!=PS->base)  {    printf("%d ",P->data);    P=P->next;  }  printf("\n");}bool Empty(PSTACK PS){  if(PS->top == PS->base)    return true;  return false;}bool Pop(PSTACK PS,int *val){  if(Empty(PS))  {    printf("栈为空,出栈失败!");    return false;  }  else  {    PNODE P=PS->top;    *val = P->data;    PS->top=P->next;    free(P);    return true;  }}int main(){  int n,val;  printf("请输入一个十进制数值:");  scanf("%d",&n);   STACK S;  Init(&S);  while(n!=0)  {    int t=n%8;    Push(&S,t);    n=n/8;  }  while(!Empty(&S))  {    Pop(&S,&val);    printf("%d ",val);  }  return 0;}

好啦,小伙伴们今天的分享就到这,你们学了吗!有什么问题在微信公众号私信我吧!明天见喽!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值