0
点赞
收藏
分享

微信扫一扫

逆波兰表达式(后缀表达式)

十里一走马 2022-03-27 阅读 97
数据结构

实验项目:

1、输入一个标准的后缀表达式

2、利用栈结构,计算该(后缀)表达式的结果

(新手敲敲员,如有错误望各位斧正)

下面直接上代码:

#include<stdio.h>
#include<stdlib.h> //包含atof函数,malloc函数,reallloc函数
#include<ctype.h> //包含isdigit函数

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 20
#define ERROR -1
#define OK 1

typedef double ElemType;
typedef struct
{
	ElemType *base; //栈顶指针
	ElemType *top; //栈底指针
	int stackSize; //栈的容量,其中s.top-s.base可以表示该栈的容量
}sqStack;

//顺序栈的初始化
void InitStack(sqStack *s)
{
	s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); //分配内存空间
	if( !s->base )
	{
		exit(0); //分配内存空间失败
	}

	s->top=s->base; 
	s->stackSize = STACK_INIT_SIZE; //分配成功
}

//顺序栈入栈
void Push(sqStack *s,ElemType e)
{
	if( s->top - s->base >= s->stackSize )
	{
		s->base=(ElemType *)realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType)); //扩增栈的容量
		if( !s->base)
		{
			exit(0); //扩增失败
		}
	}

	*(s->top)=e;
	s->top++;
}

//顺序栈出栈
int Pop(sqStack *s,ElemType *e)
{
	if( s->top = s->base )
	{
		return ERROR;
	}
	*e=* -- s->top;
	return OK;
}

int main()
{
	sqStack s;
	char c;
	double d,e;
	char str[MAXBUFFER];
	int i=0;
	
	InitStack (&s);

	printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志:\n");
	scanf("%s",&c);

	while( c != '#')
	{
		while( isdigit(c) || c=='.')
		{
			str[i++]=c;
			str[i]='\0';
			if( i>=10 )
			{
				printf("出错,输入的单个数据过大!\n"); //这里防止单个数据过于冗长
				return -1;
			}
			scanf("%c",&c);
			if( c==' ')
			{
				d = atof(str);
				Push(&s,d);
				i=0;
				break;
			}
		}

		switch(c)
		{
			case '+':
				Pop(&s,&e);
				Pop(&s,&d);
				Push(&s,d+e);
				break;
			case '-':
				Pop(&s,&e);
				Pop(&s,&d);
				Push(&s,d-e); //d先进后出,故d是被减数
				break;
			case '*':
				Pop(&s,&e);
				Pop(&s,&d);
				Push(&s,d*e);
				break;
			case '/':
				Pop(&s,&e);
				Pop(&s,&d);
				if( e != 0) //判断除数是否为0
				{
					Push(&s,d/e);
				}
				else
				{
					printf("\n出错:除数为零!\n");
					return -1;
				}
				break;
		}
		scanf("%s",&c);
	}

	Pop(&s,&d); //弹出结果
	printf("最终结果为:%f\n",d);
	return 0;
}

 

举报

相关推荐

0 条评论