栈是一种重要的线性结构。
栈必须通过顺序表或者链表来实现。
栈是一个 先进后出 的线性表,它要求只在表尾进行数据的删除和插入等操作。
线性表有两种存储方式,即顺序表存储和链表存储。一般的栈都是用顺序表存储形式实现的,因此也叫顺序栈。

一、栈实例

利用栈的数据结构,将二进制数转换为十进制数。

#include <stdio.h>
#include <math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType;  //将char定义为ElemType
typedef struct 
{
  ElemType *base;  //指向栈底的指针变量
  ElemType *top;  //指向栈顶的指针变量
  int stacksize; 
   
}sqStack;

//创建一个栈
initStack(sqStack *s)  
{
   //内存中开辟一段连续空间作为栈空间,首地址直接赋给s->base 
  s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  if(!s->base) exit(0);  //分配空间失败
  s->top = s->base;    //最开始,栈顶就是栈底
  s->stacksize = STACK_INIT_SIZE;  //最大容量为STACK_INIT_SIZE
   
}

//入栈操作
Push(sqStack *s, ElemType e) //
{
  if(s->top - s->base >= s->stacksize)  //判断栈是否已满
  {
    //如果栈满,通过realloc()函数追加空间
    s->base = (ElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(ElemType));
    if(!s->base) exit(0);    //存储空间分配失败
    s->top = s->base + s->stacksize;
    s->stacksize = s->stacksize + STACKINCREMENT;   //设置栈的最大容量
  }
  *(s->top) = e;   //放入数据
    s->top++;   //top指针自增1
}

//出栈操作
Pop(sqStack *s, ElemType *e)
{
  if(s->top == s->base) return; //栈为空,程序返回
  *e = *--(s->top);   //将栈顶元素取出,同时top指针自减1
}

int stackLen(sqStack s) //计算二进制数的长度
{
  return(s.top - s.base);
}

DestroyStack(sqStack *s)
{
  free(s->base);            //释放掉内存空间
  s->base = s->top = NULL;  //栈底栈顶指针置NULL
  s->stacksize = 0;         //设置栈的最大容量为0
}

//测试函数
 int main () 
{ 
  ElemType c;
  sqStack s;
  int len, i , sum = 0;
  printf("Please input a Binary digit\n");

  initStack(&s);  //创建一个栈,用来存放二进制字符
  //输入0/1字符表示二进制数,以#结束
  scanf("%c",&c);

  while(c!= '#')
  {
    Push(&s,c);
    scanf("%c",&c);
  }

  getchar();
  len = stackLen(s);//得到栈中的元素个数,即二进制数的长度
  for(i=0; i<len; i++)
  {
    Pop(&s,&c);
    sum = sum +(c-48) * pow(2,i); // 转换为十进制
  }
  printf("Decimal is %d\n",sum);
  DestroyStack(&s);  //释放栈空间
  getche();
  
   return 0;
}

输出结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值