数据结构----栈运用的小例子

题:输入一个10进制整数,输出16进制。

    转化16进制数,首先应该除以基数16,得到的模为转化后的最低位的数,得到的商再除以基数16,再得到模就是下个位的数........以此类推,当商等于0时,停止转化。这样我们很容易想到运用栈的特性先进后出来保存得到模,最后全部打印出来;下面使用顺序栈实现:

#include <stdio.h>
#include <stdlib.h>
#define N 20
typedef int datatype;
typedef struct stack{
datatype data[N];
int top;
}sqstack;

int main()
{
	int n;
	scanf("%d",&n);
	sqstack *s;
	s = (sqstack *)malloc(sizeof(sqstack));
	s -> top =-1;
	while(n>0)
	{
		s -> data[++s->top]=n%16;
		n= n/16;
	}
	while(-1 !=s->top)
	{
	  if(s -> data[s ->top] > 9)
		  printf("%c",s -> data[s -> top]-10 + 'a');
	  else
		  printf("%d",s-> data[s -> top]);
	 s -> top --;
	}
	puts("");
	return 0;
}

题:求一个表达式的计算结果

      首先要建立2个栈:操作数栈和运算符栈,这里要考虑到运算符的优先级。

     规则:1、自左向右扫面表达式,如遇到操作数一律进栈;

                2、当遇到运算符时,如果他的优先级比栈顶元素的优先级别高时,就进栈。反之,取出栈顶元素和操作数的栈顶元素进行计算,并将结果存如操作数栈,然后继续。

                3、左括号一律进运算符栈,右括号一律不进运算符栈,取出运算符栈栈顶元素和操作数栈顶的两个操作数进行计算,并将结果压入操作数栈,知道取出左括号为止。按照下面的规则,实现代码:

       

#include <stdio.h>
#include <stdlib.h>
#include "linkstack.h"

#define  N  32

int Pri(char op)
{
	switch ( op )
	{
	case '+':
	case '-':
		return 1;
	case '*':
	case '/':
		return 2;
	}

	return 0;
}

int Compute(int left, int right, char op)
{
	switch ( op )
	{
	case '+':
		return left + right;
	case '-':
		return left - right;
	case '*':
		return left * right;
	case '/':
		return left / right;
	}

	return 0;
}

void del_op(linkstack *operand, linkstack *operator, char op)
{
	int left, right;
	char sign;

	while (!EmptyLinkstack(operator) && Pri(op) <= Pri(GetTop(operator)))
	{
		right = PopLinkstack(operand);
		left = PopLinkstack(operand);
		sign = PopLinkstack(operator);
		PushLinkstack(operand, Compute(left, right, sign));
	}
	PushLinkstack(operator, op);

	return;
}

int main()
{
	char str[N], *p = str, sign;
	int sum = 0, left, right;
	linkstack *operand, *operator;

	operand = CreateLinkstack();
	operator = CreateLinkstack();

	scanf("%s", str);
	while (*p != '\0')
	{
		if ('0' <= *p && *p <= '9')
		{
			while ('0' <= *p && *p <= '9')
			{
				sum = 10*sum + *p - '0';
				p++;
			}
			PushLinkstack(operand, sum);
			sum = 0;
		}
		else
		{
			del_op(operand, operator, *p);
			p++;
		}
	}

	while ( ! EmptyLinkstack(operator) )
	{
		right = PopLinkstack(operand);
		left = PopLinkstack(operand);
		sign = PopLinkstack(operator);
		PushLinkstack(operand, Compute(left, right, sign));
	}
	printf("%s = %d\n", str, GetTop(operand));

	return 0;
}



 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值