[C/C++ 演算法]-資料結構與演算法(文魁):後序表示法計算之程式範例
[C/C++ 演算法]-資料結構與演算法(文魁):後序表示法計算之程式範例
線上執行結果:http://www.tutorialspoint.com/compile_c_online.php
code2html:http://tohtml.com/
/* =============== Program Description =============== */
/* 程式名稱 : 7_4_1.cpp */
/* 程式目的 : 後序表示法計算之程式範例 */
/* 輸 入 : 後序表示法的字串陣列資料 */
/* 輸 出 : 後序表示法的字串公式運算後的計算 */
/* =================================================== */
#define n 12
// 宣告標頭檔
#include "stdio.h"
// 宣告全域變數
float Stack[n];
int top=-1;
// 宣告函式原型
// 利用傳址的方式把Array A傳進parsing函式中
float parsing3(char *A);
int isOperand(char ch); /* 判斷��否為運算元 */
float pop(void); /* 由堆疊取出資料 */
void push(float ch); /* 將資料放入堆疊 */
float operation(char op,float ch1,float ch2); /* 將資料依照運算符號作運算 */
void main(void)
{
float ret;
char A[n]="1234+*+65/-";
// 運算前的資料
printf(" Data before processing : %s\n",A);
printf("\n");
ret = parsing3(A);
// 運算後的值
printf(" Data after processing : %f\n",ret);
printf("\n");
getchar();
}
float parsing3(char *A)
{
int i,j=0;
float no1,no2,ret;
char ch;
for(i=0;i<n-1;i++)
{
ch = A[i];
if(isOperand(ch))
push((float)(ch-48));
else
{
no1 = pop();
no2 = pop();
ret = operation(ch,no1,no2);
push(ret);
}
}
return pop();
}
int isOperand(char ch)
{
int ret;
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
ret = 0;
break;
default:
ret = 1;
break;
}
return ret;
}
float pop(void)
{
float ch = Stack[top];
Stack[top] = 0;
top--;
return ch;
}
void push(float ch)
{
Stack[++top]=ch;
}
float operation(char op,float ch1,float ch2)
{
switch(op)
{
case '+':
return ch2 + ch1;
case '-':
return ch2 - ch1;
case '*':
return ch2 * ch1;
case '/':
return ch2 / ch1;
default:
return 0;
}
}