2 1棧的應用(括號匹配問題 簡單計算器)

2021-10-05 07:39:37 字數 3961 閱讀 9556

二、簡單計算器

一、括號匹配問題

1、題目和要求

時間限制:1s,記憶體限制:32mb,特殊判題:否

2、總結

//修改前,計算輸入字串長度

intstringlength

(char

* c)

else}}

//修改後,計算輸入字串長度

intstringlength

(char

* c)

else

}return i;

}

3)由於系統通過判斷是否遇到』\0』,來決定是否終止字串輸出;因此,當陣列預留空間大於需要輸出的陣列長度時,在輸出字串的末尾一定要加上output_string[strlen(input_string)] = '\0'作為結束符,否則還會繼續輸出一些未知的東西。

怎樣的char陣列,系統會自動在結尾加上』\0』呢?

1.當以字串形式在**中為陣列賦值時,系統會自動為』\0』開乙個儲存空間。

2.字串長度不包括』\0』。

3、思路

主要思路:輸入字串後,從後往前遍歷。遇到右括號入棧;遇到左括號根據中間棧中的內容進行下一步操作,如果棧為空則不匹配,如果棧頂為右括號則出棧。當輸入字串遍歷結束後,若棧中還剩餘則不匹配。

4、**

#include

#include

#include

using

namespace std;

#define n 100

//)(rttyy())sss)(

//儲存括號和位置資訊

class

bracket

;void

set(

int p,

char v)

;int

getpos()

char

getvalue()

};intmain()

else

}break

;default

: output_string[i]

=' ';}

}while

(!s.

empty()

) output_string[

strlen

(input_string)]=

'\0'

;printf

("%s\n"

,input_string)

;printf

("%s\n"

,output_string)

;return0;

}

二、簡單計算器

1、題目和要求

時間限制:1s,記憶體限制:32mb,特殊判題:否

2、總結

1)using namespace std.h兩種方式的區別。選自:標頭檔案加.h和不加,h區別,以及using namespace std。

.h是c語言中使用的,當使用.h時,相當於在c中呼叫庫函式,使用的是全域性命名空間。

c++ 標準程式庫中的所有識別符號都被定義於乙個名為std的namespace中,因此使用前要宣告命名空間。using namespace std是c++中宣告命名空間的一種方式。

2)stdioiostream兩種標準輸入輸出庫的區別。

stdio屬於c語言,輸入輸出為printf(),scanf()。

iostream屬於c++,輸入輸出為cout<>…。

3)c++中字串的儲存和讀取方式。c++儲存字串的方法( 讀取字串、char 陣列、string 型別)

在下面的**中,沒有指定getline()函式的結束符,輸入ctrl+z即可結束。

4)c語言中保留小數點後兩位數:printf("%.2lf",a);

c++中保留小數點後兩位數:cout << fixed <5)注意:

3、思路

1)設兩個堆疊,乙個運算子棧,乙個數字棧。

2)從左至右依次遍歷字串。若遍歷到運算子,入運算子棧;若遍歷到數字,則開始拼接數字,完成**數字棧。

3)開始計算。

1>若運算子棧棧頂運算子為 × 、/,則彈出棧頂運算子,再從數字棧中依次彈出兩個棧頂數字,完成運算後,將結果壓入數字棧。

2>若運算子棧棧頂運算子為 + 、- 且棧頂下乙個運算子為 × 、/,則彈出棧頂運算子和棧頂數字,儲存。然後,彈出當前棧頂運算子,再從數字棧中依次彈出兩個棧頂數字,完成運算後,將結果壓入數字棧。最後,把剛剛儲存的運算子和數字壓棧。

4)若運算子棧為空,則運算結束,此時數字棧中唯一的數字即為表示式的值,顯示後,彈出,為下一輪運算清空棧。

4、**

#include

#include

#include

#include

using

namespace std;

#define n 200

stack<

char

> op;

//運算子棧

stack<

double

> num;

//運算元棧

double a,b;

//兩個運算元

double

add(

)double

jianfa()

double

mul(

)double

div(

)int

main()

//從字串開頭開始遍歷,入運算元棧和運算子棧

for(

int i=

0; i

length()

;)else

if(c<=

'9'&&c>=

'0')

num.

push

(value)

; value =0;

}else

}while

(!op.

empty()

)else

else

if(t==

'*')

else

if(t==

'/')

}break

;case

'-':

if(op.

empty()

)else

else

if(t==

'*')

else

if(t==

'/')

}break

;case

'*':

num.

push

(mul()

);break

;case

'/':

num.

push

(div()

);break;}

}if(!num.

empty()

)}return0;

}

棧的應用 括號匹配問題

typedef struct stack stack,pstack 單向鏈式儲存結構 void pushstack pstack stack,char str 左括號入棧 bool popstack pstack stack,char str 左括號出棧 非常簡單的出入棧操作 這裡就說下進棧操作不用...

括號匹配問題 棧的應用

pragma once ifndef stack h define stack h define datatype char define max size 20 typedef struct stack stack 初始化棧 void stackinit stack s 壓棧 void stack...

括號匹配問題(棧的應用)

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在,有一行括號序列,請你檢查這行括號是否配對。輸入第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no 樣例輸入 3 樣例輸出 no noyes 先了解一下棧...