计算后缀表达式——C语言实现

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Happyunlimited/article/details/80953440

程序相对简单易懂,运行程序,

在命令行中输入:123+*#(注意:由于输入字符,以‘#’结束)

输出:5.000000

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

typedef struct
{
	float *base;
	float *top;
	int StackSize;
}Stack;

//创建一个栈,100为Maxsize,#define无法定义 
void Createstack(Stack &s)
{
	s.base=(float *)malloc(100 * sizeof(float));
	s.top=s.base;
	s.StackSize=100;
	
}

//栈顶指针 
float top(Stack s)
{
	if(s.top==s.base)
	{
		return -1;
		printf("error!\n");
		//栈满               
	}
	return *(s.top-1);
}

// 入栈程序 
void push(Stack &s,float elem)
{
	if(s.top-s.base>=s.StackSize)
	{
		//扩展栈空间 
		s.base=(float *)realloc(s.base,(s.StackSize+10)*sizeof(float));
		s.top=s.base+s.StackSize;
	    s.StackSize+=10;
	}
	 *s.top++ = elem;
}

//出栈程序 
void pop(Stack &s)
{
	if(s.top==s.base)
	{
		//栈空 
		printf("error!\n");
		return ;
	}
	s.top--;
}

//判断输入运算符 
int operate(char c)
{
	switch(c)
	{
	case '+' :return 1;
	case '-' :return 1;
	case '*' :return 1;
	case '/' :return 1;
	default :return 0;
	}
}

//输入表达式 
float cal(float a,float b,char c)
{
	switch(c)
	{
	case '+' :return a+b;
	case '-' :return a-b;
	case '*' :return a*b;
	case '/' :return a/b;
	}
}

//主函数 
int main()
{
	float a,b,result;
	Stack s;
	Createstack(s);
	char c1='0';
    printf("输入后缀表达式:"); 
	while(c1!='#')
	{
		c1=getchar();

		if(!operate(c1))
		{
			
			push(s,(float) (c1-48));
		}
		else
		{
			b=top(s);
			pop(s);
			a=top(s);
			pop(s);
			result=cal(a,b,c1);
			push(s,result);
		}
	
	}
	printf("%f\n",result);
	system("pause");

	//创建一个新栈,用于计算n的阶乘 
	Stack m;

	Createstack(m);

	float i,n,item = 1;

	printf("请输入一个数字:");

	scanf("%f",&n) ;

	for (float i = n; i >= 1; i--)

		push(m, i);

	while (m.top != m.base){

		item= top(m) * item;

		pop(m);

	}

    printf("n的阶乘为:");

	printf("%f",item) ;


	return 0;
}

展开阅读全文

没有更多推荐了,返回首页