1. 程式人生 > >利用棧計算表示式的值

利用棧計算表示式的值

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
//符號棧
struct opstack {
	char data[MaxSize];//儲存操作符
	int top;//指向棧頂的指標
} op;
//數值棧
struct ststack {
	float data[MaxSize];//儲存操作符數
	int top;//指向棧頂的指標
} st;
//將算術表示式exp轉換為字尾表示式postexp
void trans(char exp[],char postexp[]) {
	char ch;
	int i=0,j=0; //i掃描exp的下標,j掃描postexp的下標
	op.top=-1;
	ch=exp[i];
	i++;
	while (ch != '\0') {
		switch(ch) {
			case '(':    //左括號
				op.top++;
				op.data[op.top]=ch;
				break;
			case ')':   //右括號
				while(op.data[op.top]!='(') { //若遇到右括弧“)”,則連續出棧輸出,直到遇到左括弧“(”為止。其中,左括弧出棧但是並不輸出
					postexp[j]=op.data[op.top];
					j++;
					op.top--;
				}
				op.top--;
				break;
			case '+':   //為'+'或'-'時,其優先順序不大於棧頂任何運算子的優先順序,直到')'
			case '-':
				while (op.top!=-1 && op.data[op.top]!='(') {
					postexp[j]=op.data[op.top];
					j++;
					op.top--;
				}
				op.top++;
				op.data[op.top]=ch;
				break;
			case '*':
			case '/':  //為'*'或'/'時,其優先順序不大於棧頂為'*'或'/'的優先順序,直到')'
				while(op.top!=-1 && op.data[op.top]!='('
				        && (op.data[op.top]=='*' || op.data[op.top]=='/')) {
					postexp[j]=op.data[op.top];
					j++;
					op.top--;
				}
				op.top++;
				op.data[op.top]=ch;
				break;
			case ' ':
				break;  //過濾空格
			default:
				while (ch>='0' && ch<='9') {
					postexp[j]=ch;
					j++;
					ch=exp[i];
					i++;
				}
				i--;
				postexp[j]='#';
				j++;
				//postexp[j]=' '; j++; //用空格標識一個數值串結束

		}
		ch=exp[i];
		i++;
	}

	while(op.top!=-1) { //此時,exp掃描完畢,棧不空時出棧並存放到postexp中
		postexp[j]=op.data[op.top];
		j++;
		op.top--;
	}
	postexp[j]='\0'; //給postexp表示式新增結束標識

}

//對字尾表示式postexp求值
float compvalue(char postexp[]) {
	float d;
	char ch;
	int i=0;
	st.top=-1;
	ch=postexp[i];
	i++;
	while (ch!='\0') {
		switch(ch) {
			case '+':
				st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];//遇到操作符就彈出兩個數 並將結果進棧
				st.top--;
				break;
			case '-':
				st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
				st.top--;
				break;
			case '*':
				st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];
				st.top--;
				break;
			case '/':
				if(st.data[st.top]!=0)
					st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
				else {
					printf("\n\t除零錯誤!\n");//防止除數為0
					exit(0);
				}
				st.top--;
				break;
			default:
				d=0;
				while (ch>='0' && ch<='9') { //遇到運算元就進棧直到#為止
					d=10*d+ch-'0';
					ch=postexp[i];
					i++;
				}
				st.top++;
				st.data[st.top]=d;

		}
		ch=postexp[i];
		i++;
	}
	return st.data[st.top];//輸出棧頂元素就是結果

}

int main() {
	char exp[20];
	scanf("%s",exp);
	char postexp[30];
	float f=0.0;
	//求exp的逆波蘭式,得到postexp
	trans(exp,postexp);
	//對postexp求值
	f=compvalue(postexp);
	printf("%s = %.2f\n",exp,f);
	return  0;
}

相關推薦

利用計算表示式

#include <stdio.h> #include <stdlib.h> #define MaxSize 100 //符號棧 struct opstack { char data[MaxSize];//儲存操作符 int top;//指向棧頂的

(一)利用計算表示式

整理了一下使用資料結構這本書上的內容 順序棧類 sq_Stack.h #pragma once #include<iostream> using namespace std; template<class T> class sq_Stack { pr

利用表示式,可供小學生作業,並能給出分數

設計一個系統,能夠計算使用者輸入的代數表示式(混合四則運算),並能接收使用者自己輸入的運算結果同時給出使用者計算正確與否的判斷,具體要求如下: 1.使用者迴圈輸入不通的算術表示式(每個表示式以“#”結束),程式利用棧求解各個表示式的值; 2.程式每計算完一個表示式,就要求使

【資料結構】利用實現表示式

前言 java實現,利用int型別儲存運算元,完善了char類型範圍太小的問題,利用遞迴,完善了括號巢狀使用的問題。 執行結果截圖 程式碼實現: import java.util.Arrays; import java.util.Scanner; public

計算表示式

演算法思想: 規定運算子的優先順序表 設定兩個棧,運算數棧,運算子棧。 輸入一個表示式,自左向右掃描,進行如下處理:若遇到運算數則進棧,若遇到運算子,則與運算子棧中的棧頂元素進行優先順序比較。1.如果當前運算子優先順序大於棧頂元素的優先順序,則當前運算子進棧

2.利用計算

ida urn mat reg turn span stat strong bool 判斷是否是數字 static bool isNumeric(string input){ bool flag =true; string pattern

(計蒜客)利用實現表示式轉換並求得結果

#include <iostream> #include <string> #include <cassert> using namespace std; template<typename Type> class Stack

Day2 coding one Dijkstra雙計算演算法

需求:計算算術表示式的值,例如: ( 1 +

利用 Python 計算MD5

文章架構 目的 日常開發中,經常涉及到針對某些值進行加密的情況(隱私資訊,例如密碼等資訊)。 利用 Python 某些模組將 DataFrame(pandas)某列進行MD5加密處理很方便。 利用Python 3 與 Python 2中不同模組

利用實現計算表示式字串的(C語言)

利用字尾表示式的思想,輸入一個字串,計算其值。 計算方案 #include "LinkStack.h" int priority(char ch) { switch(ch) { case '(': return 3; case '*': case

如何用C語言計算表示式的經典應用

宣告:這個程式可以計算+,-,*,/,負數,小數 負數用括號括起來例如(-1) 負數的計算過程:(-1)  轉變為 (0-1)  哈哈~   分成六個點: 1.我的檔案結構 2.順序堆疊的標頭檔案 3.標頭

利用和佇列計算帶有括號的表示式(純理論)

可以使用將中綴表示式轉為字尾的方法。 在這裡我以一個例子來說明:先將9+(3-1)*3+10/2轉為字尾表示式9 3 1 - 3 * + 10 2 / +,再通過計算字尾表示式得到20這個結果。 在這裡簡單的介紹一下轉換原則: 1.當讀到一個運算元時,立即

利用和字尾表示式計算字尾表示式

原理不贅述,隨便找個部落格看看字尾表示式即其計算 原理簡單,實現起來有幾個小問題: Q1:A+B*C的字尾變表示式為ABC*+,當ABC為具體的1、2、3時,字尾表示式為123*+, 123怎麼理解,1和2和3還是12和3還是1和23... A1:用||間隔數字,如|1

利用完成後綴表示式計算

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

利用結構計算表示式串演算法

演算法思想: 將中綴表示式轉化為字尾表示式順序的掃描字尾表示式中的每一個字元,並作如下操作:如果該字元為運算元,則將其壓入棧中;如果該字元為操作符<operator>,則連續從棧中彈出兩個

利用將中綴表示式轉換為字尾表示式並進行計算

[問題描述] 中綴表示式是最普通的一種書寫表示式的方式,而後綴表示式不需要用括號來表示,計算機可簡化對字尾表示式的計算過程,而該過程又是棧的一個典型應用。 [實驗目的] (1) 深入理解棧的特性。 (2) 掌握棧結構的構造方法。 [實驗內容及要求]

如何用計算一個算術表示式

來源於演算法(第4版)中用棧來求算術表示式的值的思考 例如 1+2×(3+4) 基本思路 括號內的式子作為子表示式,遞迴的分解為普通表示式普通表示式只有2個優先順序,+-為0,×÷為0.5進入括號時,括號對應的這一層運算子的優先順序基礎值賦值為左括號左邊一個運算子的優先

c++利用簡單實現四則中綴表示式轉字尾表示式,並算

      最近在學習資料結構與演算法,學到棧這裡,就基於棧實現了一個簡答四則表示式算值的程式。平時我們寫的那 種表示式就是中綴,而計算機處理中綴是不佔優勢的一般都是將中綴轉成字尾再計算值,在這裡我也利用這個思路, 將中綴表示式分為以下兩部:      A.中綴表示式轉成

資料結構實驗十 利用實現算術表示式的求

[問題描述] 利用棧實現算術表示式的求值。可以簡單一些,假設表示式中含有一位整數,以及+、-、*、/、(、)。但不受此限制。(難易程度:中) [實驗目的] 1、掌握棧的應用。 2、掌握算符優先表示式求值的演算法。 3、掌握字串處理和數值的轉換。 [

計算表示式

#題目描述#小明希望破破一個密碼門。門上有一個算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”,求出的值就是密碼。小明的數學學得不好,還需你幫他的忙。(“/”用整數除法)#輸入格式#一個只有一行的算式(算式長度<=30)。#輸出格式#輸出