棧 四則運算表示式實現

2021-09-24 21:03:59 字數 3418 閱讀 9230

棧的乙個常見應用,四則運算表示式求值。

主要有兩個步驟:

1,中綴轉字尾

2,字尾求值

實現起來比較簡單,我通過c++的容器stack實現一遍。

從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即稱為字尾表示式的一部分,若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號(乘除優先加減)則棧頂元素依次出棧並輸出。並將當前符號進棧,一直到最終輸出字尾表示式為止

在程式中,中綴就是傳進來的 data字串,若為數字則直接輸出到字尾中即stack_data中。stack_buf用來快取符號,優先順序低於棧頂則輸出到字尾中。中綴遍歷完後,就將快取符號放入字尾中。

//將中綴轉換為字尾

void

step_1

(const

char

* data)

;int buf_num =0;

if_num

(*data)

//如果是數字

while

(is_num

(*data));

double t =

atof

(buf)

;if_symboe

(t)//如果是符號

stack_data.

push

(t);

}if_symboe

(*data)

elseif(

*data==

')')

//為右括號

else

}while(1

);}elseif(

*data ==

'(')

//為左括號

else

//為字母,判斷優先順序

stack_buf.

push

(*data);}

data++

;//stack_data.push(*data++);

}elseif(

*data ==

null

)else

}while

(!stack_buf.

empty()

)//棧倒置

std:

:stack<

double

> b;

while

(!stack_data.

empty()

) stack_data.

swap

(b);

}

從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到符號就將處於棧頂的兩個符號出棧,進行

運算,運算結果進棧,一直到最終獲得結果。

字尾即是stack_data,運算的結果在棧t中,最後將結果拷貝到stack_data中。

void

step_2()

}else

stack_data.

pop();

} stack_data.

swap

(t);

}

#include

#include

#define str_len 100

#define get_str(a) scanf_s("%s", s,str_len);

#define if_num(a) if((a>='0'&& a<='9')|| a=='.')

#define is_num(a) ((a>='0'&& a<='9')|| a=='.')

#define if_symboe(a) if((a=='+' || a=='-' || a=='*' ||a=='/'||a=='(' || a==')')&&a!=null)

#define is_symboe(a) (a=='+' || a=='-' || a=='*' ||a=='/'||a=='(' || a==')')

std:

:stack<

double

> stack_data;

intget_yxj

(const

char data)

}//將中綴轉換為字尾

void

step_1

(const

char

* data)

;int buf_num =0;

if_num

(*data)

while

(is_num

(*data));

double t =

atof

(buf)

;if_symboe

(t) stack_data.

push

(t);

}if_symboe

(*data)

elseif(

*data==

')')

//為右括號

else

}while(1

);}elseif(

*data ==

'(')

//為左括號

else

//為字母,判斷優先順序

stack_buf.

push

(*data);}

data++;}

elseif(

*data ==

null

)else

}while

(!stack_buf.

empty()

)//棧倒置

std:

:stack<

double

> b;

while

(!stack_data.

empty()

) stack_data.

swap

(b);

}//字尾運算

void

step_2()

}else

stack_data.

pop();

} stack_data.

swap

(t);

}void

printf_step_1()

else

printf

(" %f\n"

, buf.

top())

; buf.

pop();

}}void

printf_step_2()

intmain()

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...

四則運算表示式總結

這兩周完成了第乙個個人專案 四則運算表示式。在整個開發的過程中我有一些收穫也發現了自身的一些問題。下面就分條簡述一下。1 實現隨機生成任意長度的四則表示式 括號 2 實現四則表示式的計算 包括分數 3 實現接收使用者對某四則運算表示式計算的結果並判斷正確性。4 實現結合1 2 3功能的mfc應用程式...