基本計(jì)算器(21-03-11)

實(shí)現(xiàn)一個(gè)基本的計(jì)算器來計(jì)算一個(gè)簡單的字符串表達(dá)式 s 的值。
示例 1:
輸入:s = "1 + 1"
輸出:2

示例 2:
輸入:s = " 2-1 + 2 "
輸出:3

示例 3:
輸入:s = "(1+(4+5+2)-3)+(6+8)"
輸出:23

提示:
1 <= s.length <= 3 * 105
s 由數(shù)字诬辈、'+'、'-'、'('搅吁、')'、和 ' ' 組成
s 表示一個(gè)有效的表達(dá)式

解題思路

1落午、這個(gè)只有加減法得計(jì)算谎懦,如果是'+' 號(hào),不管有沒有括號(hào)都是一樣得板甘,如果是‘-’號(hào)党瓮,那么如果遇到括號(hào)里面得數(shù)字详炬,加號(hào)不變盐类,遇到‘-’ ,負(fù)負(fù)得正呛谜,所以要考慮這方便在跳,特別是多重括號(hào),如果多重 ‘-’ 負(fù)號(hào)隐岛,怎么處理呢猫妙,可以把這些符號(hào)存到棧中,需要得時(shí)候一層層取出來聚凹,并且再一層層彈出
2割坠、獲取當(dāng)前得元素齐帚,i++ 是為了計(jì)算處下一個(gè)元素得位置
首先任何數(shù)x1=原來得數(shù),可以當(dāng)符號(hào)使用彼哼,我們先壓入1对妄,當(dāng)遇到‘+’ ‘-’,取出當(dāng)前得棧頂元素重新賦值敢朱,假如 21-(-1+(-1))這個(gè)邏輯是怎么樣得
while循環(huán)剪菱,直接跳到數(shù)字階段,第二個(gè)while是為了取這種大于9得數(shù)字拴签,取值后計(jì)算num=21, ret=1*21=21
遇到'-'孝常,然后取出棧頂元素1,sign= -1
’(‘ 將 -1壓入棧蚓哩,
’-‘取出之前得棧頂值 -1 這個(gè)時(shí)候 變成正數(shù)构灸,然后后面進(jìn)行數(shù)字計(jì)算, num=1 ,ret=21+1=22,
然后是’+‘ 棧頂還是 sign= -1, 遇到’(‘ 繼續(xù)壓入一個(gè)數(shù)值-1岸梨,這個(gè)時(shí)候棧里面有2個(gè)數(shù)冻押,都是 -1,
然后’-‘ 這個(gè)時(shí)候sign=-(-1)=1, 運(yùn)算得時(shí)候 num=1 ret=22+1=23
然后')' 彈出棧頂?shù)玫谝粋€(gè)盛嘿,然后繼續(xù)彈出第二個(gè)

class Solution {
    public int calculate(String s) {
       Deque<Integer> stack = new LinkedList();
       stack.push(1);
       int n=s.length();
       int sign=1,i=0,ret=0;
       while(i<n){
           if(s.charAt(i)==' '){
               i++;
           }else if(s.charAt(i)=='+'){
               sign=stack.peek();
               i++;
           }else if(s.charAt(i)=='-'){
               sign=-stack.peek();
               i++;
           }else if(s.charAt(i)=='('){
               stack.push(sign);
               i++;
           }else if(s.charAt(i)==')'){
               stack.pop();
               i++;
           }else{
               int num=0;
               while(i<n&&Character.isDigit(s.charAt(i))){
                   num = 10 * num+s.charAt(i)- '0';
                   i++;
               }
               ret += sign * num;
           }
       }
    return ret;
    }
}

知識(shí)點(diǎn)

1洛巢、雙向隊(duì)列Deque是double ended queue,將其理解成雙端結(jié)束的隊(duì)列次兆,雙端隊(duì)列稿茉,可以在首尾插入或刪除元素
和Queue的區(qū)別
Queue的解釋中,Queue就是簡單的FIFO隊(duì)列芥炭。
所以在概念上來說漓库,Queue是FIFO的單端隊(duì)列,Deque是雙端隊(duì)列

Deque<Integer> queue=new ArrayDeque<>();
Deque<Integer> stack=new LinkedList<>();
ArrayDeque: 基于數(shù)組實(shí)現(xiàn)的線性雙向隊(duì)列园蝠,通常作為椕燧铮或隊(duì)列使用,但是棧的效率不如LinkedList高彪薛。
LinkedList: 基于鏈表實(shí)現(xiàn)的鏈?zhǔn)诫p向隊(duì)列茂装,通常作為棧或隊(duì)列使用善延,但是隊(duì)列的效率不如ArrayQueue高少态。

2、
void push(int x) ----將元素 x 推到隊(duì)列的末尾
int pop()------------- 從隊(duì)列的開頭移除并返回元素
int peek()----------- 返回隊(duì)列開頭的元素易遣,返回堆棧頂部的元素
Stack<String> STACK = new Stack<String>();
STACK.push("Welcome");
STACK.push("To");
STACK.push("Geeks");
STACK.push("For");
STACK.push("Geeks");
System.out.println(" stack is: " + STACK.peek());

stack is: Geeks

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末彼妻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侨歉,老刑警劉巖屋摇,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異幽邓,居然都是意外死亡摊册,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門颊艳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茅特,“玉大人,你說我怎么就攤上這事棋枕“仔蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵重斑,是天一觀的道長兵睛。 經(jīng)常有香客問我,道長窥浪,這世上最難降的妖魔是什么祖很? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮漾脂,結(jié)果婚禮上假颇,老公的妹妹穿的比我還像新娘。我一直安慰自己骨稿,他們只是感情好笨鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坦冠,像睡著了一般形耗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辙浑,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天激涤,我揣著相機(jī)與錄音,去河邊找鬼判呕。 笑死倦踢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佛玄。 我是一名探鬼主播硼一,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼累澡,長吁一口氣:“原來是場噩夢啊……” “哼梦抢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起愧哟,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤奥吩,失蹤者是張志新(化名)和其女友劉穎哼蛆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體霞赫,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腮介,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了端衰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠洗。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旅东,靈堂內(nèi)的尸體忽然破棺而出灭抑,到底是詐尸還是另有隱情,我是刑警寧澤抵代,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布腾节,位于F島的核電站,受9級(jí)特大地震影響荤牍,放射性物質(zhì)發(fā)生泄漏案腺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一康吵、第九天 我趴在偏房一處隱蔽的房頂上張望劈榨。 院中可真熱鬧,春花似錦晦嵌、人聲如沸鞋既。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑闺。三九已至,卻和暖如春棕兼,著一層夾襖步出監(jiān)牢的瞬間陡舅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工伴挚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靶衍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓茎芋,卻偏偏與公主長得像颅眶,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子田弥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 給出由小寫字母組成的字符串 S涛酗,重復(fù)項(xiàng)刪除操作會(huì)選擇兩個(gè)相鄰且相同的字母,并刪除它們。在 S 上反復(fù)執(zhí)行重復(fù)項(xiàng)刪除...
    hotRose閱讀 352評(píng)論 0 1
  • Vector容器 1商叹、vector是將元素置于一個(gè)動(dòng)態(tài)數(shù)組中加以管理的容器燕刻。vector可以隨機(jī)存取元素vecto...
    欣_可期閱讀 304評(píng)論 0 1
  • 9yue6 集合(Collection 一、集合的作用: 有兩種方式可以將對(duì)象分組: 1剖笙、創(chuàng)建對(duì)象數(shù)組 2卵洗、創(chuàng)建對(duì)...
    cGunsNRoses閱讀 2,239評(píng)論 0 0
  • 線性數(shù)據(jù)結(jié)構(gòu) 棧,隊(duì)列弥咪,deques过蹂,列表其元素在數(shù)據(jù)結(jié)構(gòu)中的位置由它被添加時(shí)的順序決定。 棧 后進(jìn)先出棧 LI...
    周少言閱讀 110評(píng)論 0 0
  • a++與++a的區(qū)別a++ 先執(zhí)行表達(dá)式聚至,再自增榴啸,在那一行中 a仍為原值++a 先自增,在執(zhí)行表達(dá)式晚岭,在那一行...
    wuhuaguo丶閱讀 402評(píng)論 0 1