数据结构第六天

一、栈

1、入栈出栈顺序:先进后出,后进先出
2、栈按分布不同分为
(1)顺序栈
在这里插入图片描述
(2)链式栈
在这里插入图片描述

二、队列

1、队列与栈的区别在于:栈是先进后出,后进先出。而队列是先进先出,后进后出。
将栈看作瓶子装水和倒水的话,可以将队列看作水龙头,先进的先出。
2、队列按分布不同分为
(1)链式队列
在这里插入图片描述

三、多项式计算器

#include <stdio.h>
#include "stack.h"
#include <stdlib.h>
#include <string.h>

//判断字符返回FALSE后进行计算
void calc(Stack *s_ope,Stack *s_num)
{	
	int sum1 = GetTop(s_num);			//取出第一个要计算的数
	pop(s_num);
	
	int sum2 = GetTop(s_num);			//取出第二个要计算的数
	pop(s_num);
	
	int ope = GetTop(s_ope);			//取出要运算的符号
	pop(s_ope);
	
	int res;							//保存运算结果
	
	switch(ope)
	{
		case '+':
			res = sum1+sum2;
			break;
		case '-':
			res = sum2-sum1;
			break;
		case '*':
			res = sum1*sum2;
			break;
		case '/':
			res = sum2/sum1;
			break;
		default:
			break;
	}
	push(s_num,res);					//将结果入栈
}


//判断是否要入栈TRUE为要入栈,FALSE为不入栈
BOOL jud(Stack *s_ope,int n)
{	
	if(Null(s_ope))
	{	
		return TRUE;
	}
	int top = GetTop(s_ope);
	switch(top)
	{
		case '+':
		case '-':
			if('*' == n || '/' == n || '(' == n)
				return TRUE;
			break;
		case '*':
		case '/':
			if('(' == n)
				return TRUE;
			break;
		case '(':
			if(')' == n)
			{
				pop(s_ope);
			}
			return TRUE;			//有点问题
			break;
		default:
			break;
	}
	return FALSE;
}


//对字符进行操作
void deal_ope(Stack *s_ope,Stack *s_num,int n)
{
	if(TRUE == jud(s_ope,n))			//返回为TRUE入栈
	{
		push(s_ope,n);
	}
	else								//返回为FALSE,不入栈,并对数据进行处理
	{
		while(FALSE == jud(s_ope,n))
		{	
			calc(s_ope,s_num);
		}
		
		if(')' != n)
		{
			push(s_ope,n);
		}	
	}
}

int main()
{	
	char buf[100];
	printf("请输入要计算的式子\n");
	fgets(buf,100,stdin);
	buf[strlen(buf)-1] = '\0';
	
	char *p = buf;				//用来遍历数组
	
	Stack s_num;				//创建栈存放数字
	Stack s_ope;				//创建栈存放符号
	Init(&s_num);				//初始化
	Init(&s_ope);
	
	while(*p)
	{
		if(*p >= '0' && *p <= '9')		//数字入栈
		{	
			int tmp = 0;
			while(*p >= '0' && *p <= '9')
			{
				tmp = tmp*10+*p - '0';
				p++;
			}
			push(&s_num,tmp);
			continue;
		}
		
		deal_ope(&s_ope,&s_num,*p);		//字符入栈
		
		p++;
	}
	while (!Null(&s_ope))					//如果字符栈不为空,说明数据还没计算玩
		calc(&s_ope,&s_num);
	
	int sum = GetTop(&s_num);			//得到并且打印最终结果
	printf("%d\n",sum);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值