栈应用之括号匹配

                   栈的使用之括号匹配

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 }
View Code
不要做一个似懂非懂的人,做一个脚踏实地的程序员
原文地址:https://www.cnblogs.com/xuexiaohei/p/4155165.html