1. 程式人生 > >很簡單的C++實現四則運算

很簡單的C++實現四則運算

網上看了些C++實現四則運算的文章,程式碼都很亂,在此給出自己實現的很簡單的可執行程式碼。

/*
 * TestRPN.h
 *
 * C++實現整數四則運算
 *
 * 有兩個步驟, 一是convert2RPN,把普通的中綴表示式改成字尾表示式(逆波蘭表示式,RPN),
 * 二是calculateRPN,計算後序表示式得到結果
 *
 *  Created on: 2015年3月17日
 *      Author: L
 */

#pragma once
#include <iostream>
#include <cctype>
#include <cstdlib>
#include <stack>
#include <sstream>
using namespace std;

/*
 * 把中綴表示式改成字尾表示式
 * 遍歷字串,如果是數字,則輸出,同時加上空格和後面的字元分隔
 * 如果括號,有2種情況:
 * 1 如果是(,進棧
 * 2 如果是),將棧裡面對應的(以及它上面的符號出棧
 * 如果是符號,總的規則是隻要棧頂的符號的優先順序不低於當前符號,則把棧頂的符號一一出棧,
 * 直到遇到棧頂的符號的優先順序低於當前符號為止。具體有2種情況:
 * 1 如果是+或-,將棧頂的符號一一出棧,直到遇到(或棧空了為止;然後把自身壓棧
 * 2 如果是*或/,將棧裡面的*或/出棧,直到遇到其他符號或棧空了為止;然後把自身壓棧
 */
void convert2RPN(string &s) {
	stringstream ss;
	stack<char> stk;
	for (size_t i = 0; i < s.length(); i++) {
		if (isdigit(s.at(i))) {
			ss << s.at(i);
			// 如果下一位不是數字,或者已經是最後一位,就加上空格
			if ((i < s.length() - 1 && !isdigit(s.at(i + 1)))
					|| i == s.length() - 1) {
				ss << ' ';
			}
		}
		else {
			if (stk.empty()) {
				stk.push(s.at(i));
			}
			else {
				switch (s.at(i)) {
				case '(':
					stk.push(s.at(i));
					break;
				case ')':
					// 把配套的'('和之上的符號出棧
					while (stk.top() != '(') {
						ss << stk.top();
						stk.pop();
					}
					stk.pop();
					break;
				case '+':
				case '-':
					// '+' '-' '*' '/'都出棧
					while (!stk.empty() && stk.top() != '(') {
						ss << stk.top();
						stk.pop();
					}
					stk.push(s.at(i));
					break;
				case '*':
				case '/':
					// '*'和'/'出棧
					while (!stk.empty() && (stk.top() == '*' || stk.top() == '/')) {
						ss << stk.top();
						stk.pop();
					}
					stk.push(s.at(i));
					break;
				}
			}
		}
	}
	// 運算完了,此時把棧的元素都pop出來
	while (!stk.empty()) {
		ss << stk.top();
		stk.pop();
	}
	s = ss.str();
}

/*
 * 計算字尾表示式
 * 遍歷字尾表示式,如果是數字,則壓棧,如果是符號,則從棧裡面pop兩個數字,然後和符號做
 * 相應的運算,同時把結果壓棧,最後把棧頂結果返回
 */
float calculateRPN(const string &s) {
	stack<float> stk;
	for (size_t i = 0; i < s.length(); i++) {
		// 如果是數字,就和之前的數字組合起來
		if (isdigit(s.at(i))) {
			int e = atoi(&s.at(i));
			int t = e / 10;
			while (t > 0) {
				i++;
				t /= 10;
			}
			i++;
			stk.push(e);
		}
		else {
			float r = stk.top();
			stk.pop();
			float l = stk.top();
			stk.pop();
			float result;
			switch (s.at(i)) {
			case '+':
				result = l + r;
				break;
			case '-':
				result = l - r;
				break;
			case '*':
				result = l * r;
				break;
			case '/':
				result = l / r;
				break;
			}
			stk.push(result);
		}
	}
	return stk.top();
}

void testRPN() {
//	string s = "9+(3-1)*3+10/2";
	string s = "9+3*10*6";
	convert2RPN(s);
	cout << calculateRPN(s) << endl;
}


相關推薦

簡單C++實現四則運算

網上看了些C++實現四則運算的文章,程式碼都很亂,在此給出自己實現的很簡單的可執行程式碼。 /* * TestRPN.h * * C++實現整數四則運算 * * 有兩個步驟, 一是convert2RPN,把普通的中綴表示式改成字尾表示式(逆波蘭表示式,RPN),

metropolis演算法的簡單c++實現以及matlab實現

metropolis是一種取樣方法,一般用於獲取某些擁有某些比較複雜的概率分佈的樣本。 1.取樣最基本的是隨機數的生成,一般是生成具有均勻分佈的隨機數,比如C++裡面的rand函式,可以直接採用。 2.取樣複雜一點是轉化發,用於生成普通常見的分佈,如高斯分佈,它的一般是通過

Android實現形形色色的進度條 簡單實現

原文地址:http://blog.csdn.net/lmj623565791/article/details/43371299 1、概述 最近需要用進度條,秉著不重複造輪子的原則,上github上搜索了一番,看了幾個覺得比較好看的ProgressBar

C語言實現聊天工具鐘的抖動窗口功能,代碼簡單,思路也簡單

.com 微信公眾號 eight 後來 這就是 get -i 答案 ros 想必都知道QQ聊天對話框中,有一個抖動個功能,相信大家也都用過,但能否用C語言做出來呢?答案肯定是可以的! 至於如何,今天就為大家分享出來!這就是今天的主題。 制作流程:簡直簡單的小編都不好意思說

使用簡單工廠模式實現四則運算 C++

今天實現了一個簡單工廠模式, 實現四則運算。 說下對簡單工廠的理解, 個人感覺他就是利用一個工廠類的靜態函式獲取一個工廠產品的例項, 在C++中表現就是 獲取一個指向產品的派生類的基類指標, 利用多型 實現具體產品類的呼叫。 ie, 利用工廠類負責建立物件的

簡單測試--C#實現中文漢字轉拼音首字母

esp chart htm foreach ext ads linq 類庫 play 第一種: 這個是自己寫的比較簡單的實現方法,要做漢字轉拼音首字母,首先應該有一個存儲首字母的數組,然後將要轉拼音碼的漢字與每個首字母開頭的第一個漢字即“最小”的漢字作比較,這裏的最小指的是

C++實現簡單的文本查詢

ber number map () first begin ifstream adf times 1 該程序將讀取用戶指定的任意文本文件,然後允許用戶從該文件中查找單詞。查詢的結果是該單詞出現的次數,並列出每次出現所在的行。如果某單詞在同一行中多次出現,程序將只顯示該

C# 實現一個簡單的 Rest Service 供外部調用

message [] operation rem adk www span method title 用 C# 實現一個簡單的 Restful Service 供外部調用,大體總結為4點: The service contract (the methods it o

C 雙向鏈表的簡單排序實現

rtb swap 結構 code str 表頭 urn else 重新 今天偶爾看到了C結構體的單項鏈表。 於是重新溫習了下雙向鏈表,重寫了下雙向鏈表的簡單排序實現,當做溫習總結吧。 先定義雙向鏈表 1 struct Student{ 2 int studentI

這麽說吧,java線程池的實現原理其實簡單

arr nan ads stop shc 線程異常 fixed 響應 submit 好處 : 線程是稀缺資源,如果被無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,合理的使用線程池對線程進行統一分配、調優和監控,有以下好處: 1、降低資源消耗; 2、提高響應速度;

C#實現簡單的Http請求實例

semaphore bsp .text block 通過 renren www 字節 req 本文實例講述了C#實現簡單的Http請求的方法。分享給大家供大家參考。具體分析如下: 通過.Net中的兩個類HttpWebRequest類,HttpWebResponse類來實現

C#實現簡單獲取及設置Session類

static 相互 如何 相互轉換 per body share line window 本文實例講述了C#實現簡單獲取及設置Session類。分享給大家供大家參考。具體分析如下: 這是一個簡單的C#獲取Session、設置Session類文件,本類主要實現大家最常用的兩

C++閉包,一樣簡單

exe pytho names 對象 reset bsp ini opera ruby 引用百度上對閉包的定義:閉包是指可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義(局部變量)。&ldquo

C#實現簡單的冒泡排序

read pro i++ cto bsp con nbsp ces nag 1、C#代碼下:using System;namespace ConsoleApplication1{ class Program { static void Main()

誰說C語言簡單

開頭 源代碼 stdout 一個 def 為什麽 內存 java time 前兩天,Neo寫了一篇《語言的歧義》其使用C語言討論了一些語言的歧義。大家應該也順便了解了一下C語言中的很多不可思異的東西,可能也是你從未註意到的東西。 是的,C語言並不簡單,讓我們來看看下面這些示

簡單的排序算法(CC++實現

最簡單的排序算法(C和C++實現)1、算法思想如下圖:把待排序的數都存在對應的數組的下標中,如果待排序的數有重復的,就用對應的數組加一,最後把數組的下標打印出來即可。2、源碼(C)如下:#include <stdio.h>int main (void){ int a[100], i, j,

c實現 簡單的文件管理 不含交互

字符 當前 str2 masm 器) 上層 stream file style 實現如下功能: 1、讀取指定目錄下的所有子目錄和文件信息(比如:指定目錄為C:/temp則把此目錄 下的所有子目錄下的文件信息讀出來)2、在C盤創建一個以個人姓名命名的目錄(比如:張三)3、在

C++ 實現簡單命令行學生管理系統

什麽 cos wid 屏幕 cit 環境 iterator choice umeng C++ 實現簡單命令行學生管理系統 貼吧ID: 這把問題不大 編譯環境是macOS。system(“clear”) 在windows下請換成 system(“cls”) #include

c實現四則運算程序

fop correct 等價 int 運行程序 fprintf bsp github項目 完成 github項目地址:https://github.com/xinxianquan/ruangong 成員:馬朝濱,王誌聰。 題目:實現一個自動生成小學四則運算題目的命令行程序。

簡單遠端遙控程式【網路程式設計 - 簡單遠端遙控程式,C實現

實驗內容 基於Windows下Winsocket程式設計 實現 1.list (顯示伺服器端當前路徑下所有檔案) 2.get 遠端檔案路徑 本地檔案路徑 (下載遠端檔案 到 本地檔案路徑 ) 3.port 本地檔案路徑 遠端檔案路徑 (上傳 本地檔案 到 本地檔案路徑下 ) 4.quit (退出程式) 參