C/C++ 四則運算 VS Stack [PreFix(前序式)/ InFix(中序式)/ PostFix(後序式)]

C/C++ 四則運算 VS Stack [PreFix(前序式)/ InFix(中序式)/ PostFix(後序式)]

C/C++ 四則運算 VS Stack [PreFix(前序式)/ InFix(中序式)/ PostFix(後序式)]


資料來源: http://www2.lssh.tp.edu.tw/~hlf/class-1/lang-c/stack2.htm


GITHUB: https://github.com/jash-git/cpp_postfix


Code

#include <iostream>
#include <cstdio>       /* printf, fopen */
#include <cstdlib>     /* exit, EXIT_FAILURE */
using namespace std;

#define N 50
#define OP 5

char op[OP] = {'(','+','-','*','/'};
int op_priority[OP] = {0,1,1,2,2};//與op[OP]對應,用以存放運算子的優先順序

int priority(char c);
void to_postfix(char infix[], char postfix[]);


char stack[N]; // This is a global variable.
int top=-1;
// -------------------------
//  將資料 item 放入堆疊
// -------------------------

void push(char item){
	if (top>=N-1){
		printf("Stack full!\n");
		exit(-1);
	}
	stack[++top]=item;
}
// ------------------------------------
// 傳回堆疊頂端的資料,但並非取出
// ------------------------------------
int pop(){
	if (top==-1){
		printf("Stack empty!\n");
		exit(-1);
	}
	return stack[top--];
}

void stackPrint(){
	int i;
	printf("stack =");
	for (i=0; i<=top; i++)
		printf(" %c", stack[i]);
	printf("\n");
}

// ----------------------
// 判斷是否為空堆疊
// ----------------------
bool IsEmpty(void)
{
	return (top < 0) ? true : false;
}

// ----------------------
//  判斷堆疊是否滿溢
// ----------------------
bool IsFull()
{
	return (top >= N - 1) ? true : false;
}

// --------------------------
// 傳回堆疊頂端的資料
// --------------------------
char top_data()
{
	return stack[top];
}

// ---------------------------
// 傳回運算子 c 的優先序
// ---------------------------
int priority(char c)
{
	int i;

	for( i=0; i < OP; i++)
	if(op[i] == c)
	return op_priority[i];
	return -1;
}

// ------------------------------------
// 將中置式infix轉成後置式postfix
// ------------------------------------
void to_postfix(char infix[], char postfix[])
{
	int i=0, j=-1;
	char x, y;

	while((x=infix[i++]) != '\0'){
		switch(x){
			case '(' : push(x);
					   break;
			case ')' : while(! IsEmpty() && (x=pop()) != '(')
						postfix[++j]=x;
						break;
			case '+' :
			case '-' :
			case '*' :
			case '/' : y=top_data();
					while(priority(y) >= priority(x)){
							postfix[++j]=pop();
							y=top_data();
					}
					push(x);
					break;
			default : // x ?綅呾啋
					postfix[++j]=x;
		}
	}
	while(! IsEmpty())
		postfix[++j]=pop();
	postfix[++j]='\0';
}
bool IsDight(char c)
{
	return c>='0' && c<='9';
}
int calculate(char postfix[])
{
	int point=0;
	while(postfix[point]!='\0')
	{
		while(IsDight(postfix[point]))
			push(postfix[point++]);
	int a=pop()-'0', b=pop()-'0',c=0;
	switch(postfix[point])
	{
		case'+':c=b+a;
				break;
		case'-':c=b-a;
				break;
		case'*':c=b*a;
				break;
		case'/':c=b/a;
				break;
	}
	push(c+'0');
	point++;
	}
	return pop()-'0';
}
void pause()
{
    printf("Press Enter key to continue…");
    fgetc(stdin);
}
int main()
{
    setlocale(LC_ALL,"Chinese_Taiwan.950");
    //cout << "Hello world!" << endl;
	char infix[50], postfix[50];

	printf("請輸入運算式: ") ;
	scanf("%s",infix);
	to_postfix(infix,postfix);
	printf("\n\n中序式 : %s \t後序式 : %s\n",infix , postfix);
	printf("答案: %d\n", calculate(postfix));
	pause();
    return 0;
}


完整教學文:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *