括號匹配問題
問題:假設乙個演算法表示式種包含圓括號、方括號、花括號三種型別的括號,編寫乙個函式,用來判斷表示式種的括號是否正確配對。
括號匹配有四種情況:
(1)右括號多於左括號
(2)左右括號次序匹配不正確
(3)左括號多於右括號
(4)左右括號匹配正確
實現思想 :定義乙個棧,遇到左括號時就入棧,遇到右括號時便令棧頂店的左右括號進行匹配
當棧為空,右括號多於左括號
當字串遍歷結束時,棧不為空,左括號多於右括號
當棧頂的左括號和右括號不匹配時,次序不匹配
當字串遍歷結束後,棧為空,匹配正確
#include
using namespace std;
#include
#include
stack<
char
> s;
bool isbrackets
(char e)
//判斷字元是否為空')
return true;
return false;
}bool matchbrackets
(char
* pstr)
char c = s.
top();
if(c ==
'('&& c ==
')'|| c ==
'['&& c ==
']'|| c =='')
s.pop();
else}}
}if(!s.
empty()
) cout <<
"左右括號匹配正確"
<< endl;
return true;
}int
main()
逆波蘭表示式
逆波蘭表示式也叫字尾表示式,先運算元,後操作符。
實現原理:棧後進先出 ,順序遍歷波蘭表示式,遇到運算元的時候入棧 , 遇到操作符,先讓運算元出棧運算運算元,然後再把運算結果入棧,所有的算式都可以用逆波蘭表示式寫出來
#ifndef __reverse_order_expression_h__
//12*(3+4)-6+8/2 -----> 12 3 4 + *6 - 8 2/ +
//給定數列操作12 3 4 + *6 - 8 2/ +
#include
#include
#include
#define maxsize 15
typedef
enum operation
way;
typedef
int datatype;
typedef
struct cell
cell;
//進行逆波蘭填棧操作
//建立棧
typedef
struct stack
stack;
//棧的初始化
void
initstack
(stack * s)
//入棧
void
pushstack
(stack * s, datatype d)
s->data[s->top]
= d;
s->top++;}
//取棧頂元素並出棧
datatype topstack
(stack *s)
s->top--
;return s->data[s->top];}
datatype order
(cell arr,
int size,stack *s)
case sub:
case mul:
case div:
case data:
default:}
}return
topstack
(s);
}int
main()
,,,,
,,,,
,,};
int size =
sizeof
(arr)
/sizeof
(arr[0]
);initstack
(&s)
;printf
("該表示式12*(3+4)-6+8/2 -----> 12 3 4 + *6 - 8 2/ +的值為%d \n"
,order
(arr, size,
&s))
;system
("pause");
return0;
}#endif
棧的應用 括號匹配問題
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 先了解一下棧...