1. 程式人生 > >計算字尾表示式——C語言實現

計算字尾表示式——C語言實現

程式相對簡單易懂,執行程式,

在命令列中輸入: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;
}