#1851. 栈-课堂案例2

栈-课堂案例2

题目描述

输入一个由左右小括号'( '、') '构成的字符串。要求小括号需要成对出现,且必须是先左括号后右括号,即 )( 不是正确的格式。 即 (()) 或 (()()) 等为正确的格式,(() 或 ()) 或 ((( 均为不正确的格式。 给定一串括号输入(换行作为结束符),检测格式是否正确,若正确输出YES,错误输出NO。(字符串长度≤100) 【输入样例1】 (()()) 【输出样例1】 YES #include #include using namespace std; #define MAXN 100 char stack[MAXN+1] = {0};//栈数据存储在下标1~MAXN int p = 0; // 栈顶元素的下标。初始(栈空的时候)为0 bool empty(){ // 询问栈是否为空 return p == 0 ? true:false; } void push(char x){ // x入栈 if(p < MAXN){//还没满 p++; stack[p] = x; } } char pop(){ // 出栈 if(!empty()){ int x = stack[p]; p--; return x; } cout << "Stack is empty"; return -1; } char top(){ // 查看栈顶元素 if(!empty()) return stack[p]; cout << "Stack is empty"; return -1; } int main(){ char a[MAXN]={0}; // 字符串 int len; cin >> a; len = strlen(a); // 遍历字符串,进行小括号匹配 for(int i=0; i <len; i++){ if (a[i] == '('){ //左括号入栈 push(a[i]); } else{ // 右括号进行匹配 // 栈不为空,说明必然有一个左括号可以和当前右括号匹配,栈顶可以出栈 // 栈空,则无法匹配 if (!empty()) { pop(); } else { cout << "NO"; return 0; } } } if (empty()) cout << "YES"; else // ((()) 这种情况,遍历完成后栈还没清空 cout << "NO"; return 0; } /* 【输入用例2】 )(()) 【输出用例2】 NO 【输入用例3】 (()))() 【输出用例3】 NO 【输入用例4】 ((()) 【输出用例4】 NO

输入格式

无

输出格式

(见样例)

样例

输入样例 1

(()())

输出样例 1

YES

输入样例 2

)(())

输出样例 2

NO

输入样例 3

(()))()

输出样例 3

NO

输入样例 4

((())

输出样例 4

NO