逆波兰计算器的编写

C语言 码拜 3年前 (2017-04-22) 320次浏览
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
 
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10
typedef char ElemType;
typedef struct 
{
	ElemType *base;
	ElemType *top;
	int stacksize;
}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=s->base+s->stacksize;
		s->stacksize=s->stacksize+STACKINCREMENT;
	}
	*(s->top)=e;
	s->top++;
}//入栈操作
void Pop(SqStack *s,ElemType *e)
{
	if(s->top==s->base)
	{
		return ;
	}
	*e=*--(s->top);
}
int Stacklen(SqStack s)
{
	return (s.top-s.base);
}
int main()
{
	SqStack s;
	char c;
	double d,e;
	char str[MAXBUFFER];
	int i=0;
	InitStack(&s);//初始化
	printf("请按照逆波兰表达式输入待计算数据,数据与运算符之间空格隔开已#结束\n");
	scanf("%c",&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;
			}
		}////头文件ctype
		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);
			break;
		case "*":
			Pop(&s,&e);
			Pop(&s,&d);
			push(&s,d*e);
			break;
		case "/":
			Pop(&s,&e);
			Pop(&s,&d);
			if(e!=0)
			{
				push(&s,d/e);
			}
			else
			{
				printf("\n出错除数为0");
				return -1;
			}
		}
		scanf("%c",&c);
	}
	Pop(&s,&d);
	printf("最终的计算结果为%d",d);
	return 0;
}

感觉写的挺完整的,但是还是有错  不知道怎么改了  帮本人改改吧!

解决方案

40

你Push函数第二个参数的类型是ElemType,但Push(&s,d);这句中的d是double类型
Pop(&s,&d); 第二个参数类型也不对
push(&s,d-e); 第一个p是大写的

2

关于本人能否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:
A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自本人感觉很有成就感
A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)
假如想从A变成B的话,到本人的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明逆波兰计算器的编写
喜欢 (0)
[1034331897@qq.com]
分享 (0)