栈(if else)
Question
★问题描述
C 语言里面对于嵌套 if 语句的规定是: else 总是与其前面最近的且尚未配对的 if 匹配。
比如“ if if else else”, 第一个 else 会和第二个 if 匹配, 而第二个 else 会和第一个 if 匹配。现在给你 n 个字符串, 每行一个字符串为“ if” 或者“ else”, 保证“ if” 和“ else” 的个
数一样多。 现在问你这 n 个字符串按照输入的顺序, 是否能形成合法的 if-else 语句, 既对于
每个 if 都能找到相应的 else 与之匹配, 且匹配规则需要符合 C 语言的规定。
★数据输入
第一行包含一个正整数 n, 表示字符串的个数。
接下来 n 行, 每行一个“ if” 或者“ else”。
n<=100000。
★数据输出
如果存在 if 找不到与之配对的 else, 输出“ NO”( 不包含引号)。
否则, 输出一个整数 x, 代表距离最远的一对 if-else 中间的 if-else 匹配数。 比如“ if else
if if else else”中第 1 个 if 和第 2 个 else 匹配, 且它们之间的距离最远, 中间存在一对 if else,
所以, 输出 1。
| 输入文件示例 | 输出文件示例 |
|---|---|
| 6 if else if if else else |
1 |
| 2 else if |
NO |
Anwser
// Stack.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
#define IF 1
#define ELSE 2
template<typename T>
class Stack
{
public:
Stack(int capcity = 100000);
~Stack();
void ClearStack();
bool IsEmpty();
bool IsFull();
int StackLength();
T GetTop();
void Push(T e);
void Pop();
private:
T* elemArray;
int top;
int capcity;
};
template <typename T>
Stack<T>::Stack(int capcity)
{
if (capcity <= 0)
{
return;
}
this->capcity = capcity;
top = 0;
elemArray = new T[capcity];
}
template<typename T>
Stack<T>::~Stack()
{
delete[] elemArray;
}
template<typename T>
void Stack<T>::ClearStack()
{
top = 0;
}
template<typename T>
bool Stack<T>::IsEmpty()
{
return (top == 0);
}
template<typename T>
bool Stack<T>::IsFull()
{
return (top == capcity);
}
template<typename T>
int Stack<T>::StackLength()
{
return top;
}
template <typename T>
T Stack<T>::GetTop()
{
if (IsEmpty())
{
return -1;
}
return elemArray[top - 1];
}
template <typename T>
void Stack<T>::Push(T e)
{
if (IsFull())
{
return;
}
elemArray[top] = e;
top++;
}
template<typename T>
void Stack<T>::Pop()
{
if (IsEmpty())
{
return;
}
top--;
}
//if->1 else->2
int IfOrElse(string inputString)
{
if (!inputString.compare("if"))
return 1;
else if (!inputString.compare("else"))
return 2;
else return -1;
}
Stack<int> ifElseStack(100005);
int main()
{
int inputNumber;
int maxLength = 0;
int tempLength = -1;
string inputString;
cin >> inputNumber;
for (int i = 0; i<inputNumber; i++)
{
cin >> inputString;
int stringToInt = IfOrElse(inputString); //if->1,else->2
//Push Stack / Stack Empty Handle
if (ifElseStack.IsEmpty())
{
ifElseStack.Push(stringToInt);
}
else if (stringToInt == IF)
{
ifElseStack.Push(stringToInt);
}
else if (stringToInt == ELSE && ifElseStack.GetTop() == IF)
{
ifElseStack.Pop();
tempLength++;
}
else
{
ifElseStack.Push(stringToInt);
}
//maxLength
if (ifElseStack.IsEmpty())
{
maxLength = maxLength > tempLength ? maxLength : tempLength;
tempLength = -1;
}
}
//error>NO,yes>maxLength
ifElseStack.IsEmpty() ? cout << maxLength << endl : cout << "NO" << endl;
return 0;
}
Reference
http://blog.csdn.net/piaopiaopiaopiaopiao/article/details/39105095
浙公网安备 33010602011771号