数据结构-栈的应用学习

数制的转换问题
【问题描述】 要求编制一个程序实现下述功能:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。
【算法思想】 十进制转换为八进制的方法是除8取余。

这一计算过程是从低位到高位依次产生八进制数的各个数位;而打印输出时,应从高位到低位进行,恰好与计算过程相反。
因此,可将计算过程中得到的八进制数的各位顺序进栈,则按出栈顺序打印的序列即为与输入十进制数对应的八进制数。
具体算法如下。

void main()
{
  sqstack s;
  int n,e;
  stackinit(&s); //初始化一个空栈s
  scanf("% d\n",&n); //输入十进制整数n
  while(n) //当n不为 0时执行
  {
		push(&s,n%8); //n除以 8的余数进栈
		n=n/8; //n的新值为n除以 8取整
  }
  while(! stackempty(&s)) //当栈非空时
  {
		pop(&s,&e); //从栈s中取出顶元送往e
		printf("%d\n",e); //打印e
  }
}

括号匹配的检测
【问题描述】 假设一个算术表达式中允许含圆括号、方括号和花括号三种类型的括号,其嵌套的顺序随意,但是左右括号必须正确匹配。
例如,“[( )]))”是不正确的格式。编写一个判别表达式中括号是否正确配对出现的函数,函数原型为

int correct(char exp[])

其中,exp为字符串类型的变量,表示被判别的表达式;函数返回一个整型数据,当exp是括号正确配对的表达式时返回1,反之返回0。
【算法思想】 该问题利用栈能很好地解决。具体算法为:从前向后扫描表达式exp中的每一个字符e,若e为左括号就将e进栈,若e为右括号就弹出栈顶元素,判断它们是否属于同一种括号,若是则继续扫描,否则返回不配对标识。
当整个算术表达式扫描完毕时,若栈为空,则表示括号正确配对,否则表示不配对。具体算法如下。

int correct(char exp[])
{
    sqstack s; //用来存储括号的栈
    char*p=exp,e; //指针p初始指向字符串的首地址,e用于接收从栈中获取的字符
    while(*p! =' \0' ) //从左到右依次扫描exp中的每个字符直到字符串的末尾
    {
	    if((*p==' {') || (*p==' [') || (*p==' (' )) //若为左括号
	    {
			push(&s,*p); //左括号进栈
	    }
	    else if((*p==' )') || (*p==' ]') || (*p==' )' )) //若为右括号
	    {
			gettop(&s,&e); //将栈顶元素保存到e中
			if(*p==e) //若栈顶元素与右括号匹配则弹出栈顶元素
			{
				pop(&s,&e);
			}
			else //若栈顶元素与右括号不匹配则匹配失败
			{
				return 0;
			}
	    }
	    else
		{
			p++; //指向下一个字符
		}
    }
	if(stackempty(&s)) //若栈空则匹配成功,反之失败
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值