栈的使用之括号匹配
Char s[n]是一个字符串数组。Stack是一栈,i是元素对应的下表。设一个char flag[n]数组,用来标记是否匹配,数组中数值是‘l’(左不匹配,即没有找到右括号),‘r’(右不匹配),‘o’匹配成功。
算法描述:
(1)遍历该字符串数组。
While(遍历){
if遇到‘(’,do stack.push(i)(i 是‘(’对应的数组下表),flag[i]=’o’(不一定就是匹配成功,以后遍历完如果stack还有元素,说明没有左匹配,要改成‘l’;如果没有,则就是真正的匹配成功了);
if遇到‘)’,if stack不为空,do stack.pop()(说明匹配),flag[i]=’o’。);如果为空就不匹配,flag[i]=’r’
} do (2)
(2)如果stack.empty是false,则do while(!stack.empty()){ flag[stack.top()]=’r’(将之前的‘o’修改掉);stack.pop() }
1 // try.cpp : Defines the entry point for the console application. 2 // 3 /************************************************************************/ 4 /* 栈应用之括号匹配 */ 5 /************************************************************************/ 6 #include "stdafx.h" 7 #include"stack" 8 #include"string.h" 9 using namespace std; 10 #define FOR(n) for (int i=0;i<n;i++) 11 stack<int> mystack; 12 char flag[1000]; 13 char str[1000]; 14 int main(){ 15 16 while (scanf("%s",str)!=EOF) 17 { 18 19 memset(flag,0,strlen(str)); 20 FOR(strlen(str)){ 21 if (str[i]=='(') 22 { 23 mystack.push(i); 24 flag[i]='o'; 25 } 26 else if(str[i]==')'){ 27 if (!mystack.empty()) 28 { 29 mystack.pop(); 30 flag[i]='o'; 31 } 32 else flag[i]='r'; 33 } 34 } 35 while (!mystack.empty()) 36 { 37 flag[mystack.top()]='l'; 38 mystack.pop(); 39 } 40 flag[i]='0'; 41 puts(str); 42 puts(flag); 43 44 } 45 }