上個星期的作業,現在才改好。。。。。
基本思路:
當我們從鍵盤上輸入一串字元,比如1+(2+3),建立兩個棧,乙個存放運算子的棧toperator,乙個存放運算元number,依次遍歷。
遇到運算元就依次存放到操作棧裡;
遇到運算子時,優先順序高的就直接壓進運算子棧裡,優先順序低的就依次彈出操作棧中的兩個值與運算子進行計算,然後把計算的值再次壓進運算元棧裡。其中有括號的情況,左括號的直接壓進,當右括號遇到左括號的時候就直接彈出左括號。
程式:
類模組:
#ifndef _stack_h_
#define _stack_h_
#includeusing namespace std;
templateclass stack
;template stack::stack(int maxsize):maxsize_(maxsize),top_(-1)
templatestack::~stack()
templatevoid stack::push(const t& n)
top_++;
s_[top_] = n;
}templatevoid stack::pop()
top_--;
}templatet& stack::gettop() const
return s_[top_];
}templatebool stack::empty()const
#endif
#include#include"stack.h"
#include#includeusing namespace std;
stacknumber(100);
stacktoperator(100);
int calsum(int a,int b,char ope)//計算過程
if(ope == '/')
if(ope == '+')
if(ope == '-')
return b;
}int priority(char ch)//優先順序
if(ch == '+' || ch == '-')
if(ch == '*' || ch == '/')
}int is_number(char ch)//判斷是數字還是運算子
return 0;
}int calculate(char* buffer)
if((is_number(buffer[i])) == 0)//是運算子
else//不是第一次壓棧
else}}
} i++;//往後依次遍歷
}while(toperator.empty() != true)//遍歷結束,但是棧中還有數
return b;
}int main()
catch(int a)
{cout<<"number failed"<<__line__<
用棧實現簡單計算器
1 輸入乙個逆波蘭表示式 字尾表示式 使用棧 stack 計算其結果 2 支援小括號和多位數整數,只支援對整數的計算。從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 次頂元素 和 棧頂元素 並將結果入棧 重複上述過程直到表示式最右端,最後運...
簡單計算器(棧)
開始複習棧,這個題感覺見得很多,各種各樣的,但是核心思路就是把中綴表示式轉化為字尾表示式,我們老師說這個東西也叫作中序二叉樹轉後序二叉樹。大概實現的方式就是用棧來實現 最開始感覺沒啥思路,因為之前一直都不會這種題 論為什麼我這麼菜,之前沒有好好學過棧,知道了stl中有stack後還是方便很多 第一次...
棧實現計算器
在表示式中的轉換規則 運算元 進棧 操作符 1 進棧 空棧 優先順序高 棧頂是 同時表示式不是 2 出棧並計算 表示式符號的優先順序不高於棧頂符號 表示式為 同時棧頂不為 表示式 0 同時棧不為空 3 出棧但不計算 表示式為 同時棧頂為 標頭檔案 標頭檔案 ifndef stack h define...