您的位置:首页 > 理论基础 > 数据结构算法

数据结构复习——链栈的一些操作以及表达式中的括号是否配对问题

2017-07-03 16:07 375 查看
(提醒我自己:声明完指针并且要插入新节点的时候不要忘记malloc分配内存啊!)

**

主要思路:

**

声明一个链栈st,依次扫描字符表达式,如果遇到左括号‘(’则将其压入栈内,遇到右括号‘)’则先判断栈是否为空,为空则说明不配对,不为空则弹栈(因为此时栈中只有左括号,所以不需要像教材中那样判断弹出来的是否为左括号)。

扫描完字符串后判断栈是否为空,不为空则说明还有多余的左括号,不配对。

#include<iostream>
using namespace std;
#define ElemType char

typedef struct linknode //      声明链栈结构
{
ElemType data;
struct linknode *next;
}LiStack;

void InitStack(LiStack *&s)
{
s = (LiStack *)malloc(sizeof(LiStack));
s->next = NULL;
}

void Destory(LiStack *&s)
{
LiStack *p, *q;//q是p之后的指针
p = s;
q = p->next;
while (p->next != NULL)
{
free(p);
p = q;
q = q->next;
}
}

void push(LiStack *&s, ElemType e)//将新数据节点插入到头结点之后
{
LiStack *p;
p = (LiStack *)malloc(sizeof(LiStack));
p->next = s->next;
s->next = p;
p->data = e;
}

bool pop(LiStack *&s, ElemType &e)//引用类型的e保存出栈的值
{
if (s->next == NULL)
{
return false;
}
LiStack *p=s->next;
s->next = p->next;
e = p->data;
free(p);
return true;
}

//判断输入的表达式中括号是否配对
bool Match(char *exp, int n)//n代表表达式长度
{
int i = 0;
char e;
LiStack *st;
InitStack(st);
bool match = true;
while (i < n)
{
if (exp[i] == '(')
push(st, '(');
else if (exp[i] == ')')
{
if (st->next == NULL)
{
return false;
}
pop(st, e);
}
i++;//DONT FORGET I++!!!!!!
}
if (st->next != NULL)
{
match = false;
}
return match;
}

int main()
{
char *exp = "(((())(()))";
bool sss = Match(exp, 11);
if (sss)
{
cout << "true1" << endl;
}
else
cout << "false1" << endl;
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐