栈(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

posted @ 2017-09-16 08:58  考拉小无  阅读(641)  评论(0)    收藏  举报