1. 程式人生 > >字尾表示式求值的演算法實現

字尾表示式求值的演算法實現

字尾表示式編輯

不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則,如:(2 + 1) * 3 , 即2 1 + 3 *

運用字尾表示式進行計算的具體做法:
建立一個棧S 。從左到右讀表示式,如果讀到運算元就將它壓入棧S中,如果讀到n元運算子(即需要引數個數為n的運算子)則取出由棧頂向下的n項按操作符運算,再將運算的結果代替原棧頂的n項,壓入棧S中 。如果字尾表示式未讀完,則重複上面過程,最後輸出棧頂的數值則為結束。

程式碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct Node//棧結構體
{
	float data;
	struct Node* next;
};

typedef struct Node* Stack;
typedef struct Node* Position;

Stack CreateStack()//建立棧
{
	Position s;
	s = (Position)malloc(sizeof(Node));
	s->next = NULL;
	return s;
}

int IsEmpty(Stack s)//判斷棧是否為空
{
	return s->next == NULL;
}

void Pop(Stack s)//彈出棧
{
	if (s->next != NULL)
	{
		Position first;
		first = s->next;
		s->next = s->next->next;
		free(first);
	}
}

void Push(float x, Stack s)//壓入棧
{
	Position tempCell = (Position)malloc(sizeof(Node));
	tempCell->data = x;
	tempCell->next = s->next;
	s->next = tempCell;
}

float Top(Stack s)//檢視棧頂元素
{
	return s->next->data;
}

int main()
{
	Stack s = CreateStack();
	char str[1000];
	int flag = 0;
	while (scanf("%s", str) != EOF)
	{
		float f;
		if (f=atof(str))
		{
			Push(f, s);
		}
		else
		{
			char ch = str[0];
			float a, b,c;
			if (!IsEmpty(s))
			{
				a = Top(s);
				Pop(s);
			}
			else
			{
				flag = 1;
				break;
			}
			if (!IsEmpty(s))
			{
				b = Top(s);
				Pop(s);
			}
			else
			{
				flag = 1;
				break;
			}
			switch (ch)
			{
			case '+':
				c = a + b;
				break;
			case '-':
				c = a - b;
				break;
			case '/':
				c = a / b;
				break;
			case '*':
				c = a * b;
				break;
			}
			Push(c, s);
		}
	}
	if (flag == 0)
	{
		printf("%.2f\n", s->next->data);
	}
	else
	{
		printf("ERROR\n");
	}
}