您的位置:首页 > 其它

栈的简单应用1-平衡符号

2014-11-20 23:33 218 查看
因为在编程中,使用{}()[]等都是成对出现的,因此可以使用栈来进行一些匹配判断。

原理:

读取一段字符串,如果遇到{([这些开放字符,就将其压入栈中,如果读到})]这些封闭字符,就与当前栈顶的符号进行比较,如果栈顶的符号正好是其对应的开放符号,将栈顶元素弹出,继续读取。否则,出现警告。但是如果弹出栈顶后新的栈顶是与其匹配的开放符号,那么就是它出错了。如果全部字符串读取完毕但是栈不是空的的话,那么栈剩下的字符串都缺少匹配。

简单代码,因为使用的输入流问题对程序实现有较大误差,但思路没有问题,需要在C下修改使用,因为时间关系今天就结束这个问题。此代码没有实现对于全部字符读取完毕的检测,还有一些严重问题没有处理,所以此程序应该是失败的。请读者自己根据实际实现。

main.cpp

#include "stack.h"

char matchSymbal(char s)
{
if (s == ')')
return '(';
if (s == '}')
return '{';
if (s == ']')
return '[';
return ' ';
}

int main(void)
{

stack *symbal = createStack(10);
char s;
char tmp;
while (std::cin>>s)
{
if (s == '{' || s == '(' || s == '[')
{
push(symbal, s);
continue;
}
if (s == '}' || s == ')' || s == ']')
{
if (isEmpty(symbal))
{
log("空表错误");
}
else
{
tmp = top(symbal);
if (top(symbal) == matchSymbal(s))
{
pop(symbal);
continue;
}
else
{
pop(symbal);
if (top(symbal) == matchSymbal(s))
{
std::cout << "在 " << tmp << " 处发生错误" << std::endl;
continue;
}
std::cout << "在 " << s << " 处发生错误" << std::endl;
}
}
}
}
system("pause");
return 0;
}


stack.h

/*数组栈*/
#include "iostream"
#include "stdlib.h"

#define  minSize 5
#define  emptyStack -1
#define  fullStack -2
#define log(s); std::cout<<s<<std::endl;

typedef struct _stack_
{
int capacity;
int topOfStack;
char *Array;
}stack;

stack *createStack(int maxSize)
{
stack *s;
if (maxSize < minSize)
{
//log("Stack size is too small");
return nullptr;
}
s = (stack *)malloc(sizeof(stack));
s->Array = (char *)malloc(sizeof(char) * maxSize);
s->capacity = maxSize;
s->topOfStack = emptyStack;/*初始化为空栈*/
return s;
}

int isFull(stack *s)/*检测是否为满栈*/
{
if (s == nullptr)
{
//log("the stack has not inital");
return fullStack;
}
return s->topOfStack == s->capacity;
}

int isEmpty(stack *s)/*是否为空栈*/
{
if (s == nullptr)
{
//log("the stack has not inital");
return emptyStack;
}
return s->topOfStack == emptyStack;
}

void push(stack *s, char data)/*压栈*/
{
if (isFull(s))
{
//log("Full of Stack");
return;
}
++s->topOfStack;
s->Array[s->topOfStack] = data;
}

void pop(stack *s)/*弹出栈*/
{
if (isEmpty(s))
{
//log("Out of Stack");
return;
}
--s->topOfStack;
}

char top(stack *s)/*访问栈顶元素*/
{
if (isEmpty(s))
{
//std::cout << "Out of Stack,Code is ";
return emptyStack;
}
return s->Array[s->topOfStack];
}

void makeEmpty(stack *&s)/*置空栈*/
{
free(s->Array);
free(s);
s = nullptr;
}


抱歉。

以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: