C++就近匹配
一、栈的顺序存储
代码如下(示例):
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#define MAX 1024
#include <vector>
template<typename T>
class SStack
{
public:
SStack();//无参构造
//入栈
void push_Stack(const T& data);
//出栈
void pop_Stack();
//返回栈顶元素
T top_Stack();
//返回栈的大小
int size_Stack();
//判断是否为空
bool isempty_Stack();
//销毁栈
~SStack();
private:
T data[MAX];
int m_size;
};
template <typename T>
SStack<T>::SStack()
{
memset(data, 0, sizeof(data));
this->m_size = 0;
}
//入栈
template <typename T>
void SStack<T>::push_Stack(const T& data)
{
this->data[m_size] = data;
this->m_size++;
}
//出栈
template <typename T>
void SStack<T>::pop_Stack()
{
if (this->m_size>0)
{
this->m_size--;
}
}
//返回栈顶元素
template <typename T>
T SStack<T>::top_Stack()
{
if (this->m_size == 0)
{
return T();
}
return this->data[m_size - 1];
}
//返回栈的大小
template <typename T>
int SStack<T>::size_Stack()
{
return this->m_size;
}
//判断是否为空
template <typename T>
bool SStack<T>::isempty_Stack()
{
return this->m_size == 0;
}
template <typename T>
SStack<T>::~SStack()
{
this->m_size = 0;
}
一、就近匹配
代码如下(示例):
int isLeft(char ch)
{
return ch == '(';
}
int isRight(char ch)
{
return ch == ')';
}
void printError(const char* errmsage, const char* ch,const char* pos)
{
cout << "错误信息:" << errmsage << endl;
cout << ch << endl;
int num = pos-ch;
for (int i = 0; i < num; i++)
{
cout << " ";
}
cout << "|" << endl;
}
void test01()
{
SStack<const char*>ss;
const char* str= "1+2+(3+4))+4(+4" ;
const char* p = str;
while (*p != '\0')
{
if (isLeft(*p))
{
//入栈
ss.push_Stack(p);
}
if (isRight(*p))
{
if (ss.size_Stack()>0)
{
//出栈
ss.pop_Stack();
}
else
{
printError("输入的右括号没有对应的左括号", str,p);
}
}
p++;
}
while (!ss.isempty_Stack())
{
printError("输入的左括号没有对应的右括号", str, ss.top_Stack());
//出栈
ss.pop_Stack();
}
}
测试结果