1. 程式人生 > 其它 >資料結構-四則表示式運算

資料結構-四則表示式運算

//四則運算
//xxg
#pragma once
#include<iostream>
using namespace std;
typedef struct numNode{//數字棧
	char data;
	struct numNode* next;
}numNode,*numListStack;
typedef struct opNode {
	char data;
	struct opNode* next;
}opNode,*opListStack;
class c17
{
private:
	numListStack pushnum(numListStack num,char data) {
		numNode* p = new numNode;
		p->data = data;
		p->next = num;
		num = p;
		return num;
	}
	numListStack popnum(numListStack num ,char &numdata) {
		if (num != NULL) {
			numdata = num->data;
			numNode *p = new numNode;
			p = num;
			num = num->next;
			delete p;
			return num;
		}
	}
	opListStack pushop(opListStack op,char data) {
		opNode *p = new opNode;
		p->data = data;
		p->next = op;
		op = p;
		return op;
	}
	opListStack popop(opListStack op, char& numdata) {
		if (op != NULL) {
			numdata = op->data;
			opNode* p = new opNode;
			p = op;
			op = op->next;
			delete p;
			return op;
		}
	}
	int youxianji(char a) {
		if (a == '+') {
			return 2;
		}
		if (a == '-') {
			return 1;
		}
		if (a == '*') {
			return 3;
		}
		if (a == '/') {
			return 3;
		}
	}
	int yunsuan(char a, char b, char op) {
		int zuo = a - '0';
		int you = b - '0';
		if (op == '+') {
			cout << zuo + you;
			return zuo + you;
		}
		if (op == '-') {
			return zuo - you;
		}
		if (op == '*') {
			return zuo * you;
		}
		if (op == '/') {
			return zuo / you;
		}
	}
public:
	void main1() {
		char a[100];/*輸入的表示式*/
		char a1[100];/*字尾表示式*/
		int i = 0,length;
		numListStack numLS = NULL;
		opListStack opLS = NULL;
		cout << "請輸入正確且有意義的算術表示式:" << endl;
		cout << "按#鍵退出輸入" << endl;
		cout << "請嚴格按照一個字元一個空格間隔輸入,按空格結束" << endl;
		while (i < 100) {
			cin >> a[i++];
			if (cin.get() == '\n')
				break;
		}
		length = i;
		for (int i = 0; i < length; i++) {
			/*cout << a[i];*/
		}
		
		for (int j = 0; j < length; j++)
		{
		/*	if (a[j] >= '0' && a[j] <= '9') {
				cout << endl << a[j] << endl;
				numLS = pushnum(numLS, a[j]);
			}
			else {
				opLS = pushop(opLS, a[j]);
			}*/
		}
		cout << "字尾表示式為:" << endl;
		int j = 0;
		coutreoder(opLS, a, length, a1,j);
		cout << endl << "儲存的字尾表示式陣列為:" << endl;;
		for (int k = 0; k < j; k++) 
		{  
			cout << a1[k] <<" ";
		}
		cout <<endl<< "計算結果為:" << endl;
		sum(numLS, a1, j);
	}
	//輸出字尾表示式
	void coutreoder(opListStack op,char arr[],int length,char arr1[],int &j) {
		for (int i = 0; i < length; i++) {//遍歷輸入的表示式,陣列直接輸出,運算子壓棧比較優先順序後輸出
			if (arr[i] >= '1' && arr[i] <= '9') {
				cout << arr[i] << " ";
				arr1[j] = arr[i];/*將數字存入陣列*/
				j++;
			}else{
				if (op == NULL) {/*操作符棧為空直接壓入*/
					op = pushop(op, arr[i]);
				}
				else {
					//判斷運算子優先順序
					int a = youxianji(arr[i]);//入棧優先順序
					int b = youxianji(op->data);//棧內優先順序
					if (arr[i] == '(' || arr[i] == ')') {
						continue;
					}
					if (arr[i] == '#') {/*遇到#全部彈出*/
						while (op != NULL) {
							char data;
							op = popop(op, data);
							arr1[j] = data;
							j++;
							cout << data;
						}
					}
					else {
						while (a <= b) {/*直到遇到優先順序比較低的否則全部彈出*/
							char data;
							op = popop(op, data);
							arr1[j] = data;
							j++;
							cout << data;
							a = youxianji(arr[i]);//入棧優先順序
							if(op!=NULL)/*空棧直接退出*/
							  b = youxianji(op->data);//棧內優先順序
							else {
								break;
							}
						}
						/*直接壓入*/
						op = pushop(op, arr[i]);
					}
				}
			}
		     
		}

	}
	//計算結果
	void sum(numListStack num, char arr[], int length) {
		arr[length] = '#';
		for (int i = 0; i < length+1; i++) {
			if (arr[i]>='0'&&arr[i]<='9') {
				num = pushnum(num, arr[i]);
				continue;
			}
			if (arr[i] == '#') {
				char data3;
				num = popnum(num, data3);
				int data = data3 - '0';
				cout << data;
			}
			else {
				char a;
				char b;
				num = popnum(num, a);
				num = popnum(num, b);
				char sum = yunsuan(a, b, arr[i]) + '0';
				num = pushnum(num, sum);
			}
		}
	}
};