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

来源:互联网 发布:java单例模式的优点 编辑:程序博客网 时间:2024/06/08 11:58

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

**

主要思路:

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

#include<iostream>using namespace std;#define ElemType chartypedef 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");}
阅读全文
1 0