数据结构——链栈(附基本的括号匹配)

来源:互联网 发布:连云港网站建设优化 编辑:程序博客网 时间:2024/05/14 19:34

三个文件。
链栈操作在头文件里,可以看注释实现功能。
linkstack.h文件内容如下

#ifndef LINKSTACK_H#define LINKSTACK_Htypedef int DataType;struct Node{    DataType info;    struct Node *link;};typedef struct Node *PNode;struct LinkStack{    PNode top;};typedef struct LinkStack *PLinkStack;PLinkStack createEmptyStack_link();               // 创建空栈int isEmptyStack_link(PLinkStack plstack);        // 判断是否为空void push_link(PLinkStack plstack, DataType x);   // 进栈void pop_link(PLinkStack plstack);                // 出栈DataType top_link(PLinkStack plstack);            // 取栈顶元素void print(PLinkStack plstack);                   // 链栈的打印#endif

linkstack.c文件内容如下,包括链栈的操作:

#include <stdio.h>#include <stdlib.h>#include "linkstack.h"// 创建空栈PLinkStack createEmptyStack_link(){    PLinkStack plstack;    plstack = (PLinkStack)malloc(sizeof(struct LinkStack));    if (plstack != NULL)    {        plstack->top = NULL;    }     else    {        printf("out of space!\n");    }    return plstack;}// 判断栈是否为空int isEmptyStack_link(PLinkStack plstack){    return (plstack->top == NULL);}// 进栈void push_link(PLinkStack plstack, DataType x){    PNode p;    p = (PNode)malloc(sizeof(struct Node));    if (p == NULL)    {        printf("out of space!\n");    }     else    {        p->info = x;        p->link = plstack->top;        plstack->top = p;    }}// 出栈void pop_link(PLinkStack plstack){    PNode p;    if (isEmptyStack_link(plstack))    {        printf("Empty stack pop\n");    }     else    {        p = plstack->top;        plstack->top = plstack->top->link;        free(p);    }}// 取栈顶元素DataType top_link(PLinkStack plstack){    return plstack->top->info;}// 链栈的打印void print(PLinkStack plstack){    PNode p = NULL;    p = plstack->top;    if(isEmptyStack_link(plstack))    {        printf("Empty stack pop\n");        exit(0);    }    while(p->info != NULL)    {        printf("%d\t", p->info);        if (p->link != NULL)            p = p->link;        else        {            printf("\n");            break;        }    }}

最后main.c的文件内容如下:

#include <stdio.h>#include <stdlib.h>#include "linkstack.h"int main(){    PLinkStack mystack;    int num;    mystack = createEmptyStack_link();    printf("请输入进栈的元素(0表示结束):\n");    scanf("%d", &num);    while (num)    {        printf("当前的进栈元素是:%d\n", num);        push_link(mystack, num);        scanf("%d", &num);    }    print(mystack);    while (!isEmptyStack_link(mystack))    {        printf("当前的出栈元素是:%2d\n", top_link(mystack));        pop_link(mystack);    }    return 0;}

接下来是括号匹配的练习
调用上面的linkstack.h和linkstack.c的文件
然后再需要添加两个文件BracketMatch.c和main.c
两文件内容如下:
BracketMatch.c

#include <stdio.h>#include <stdlib.h>#include "linkstack.h"#define TRUE 1#define FALSE 0int BracketMatch(PLinkStack mystack){    int flag = 1;    char ch, temp;    push_link(mystack, '#');    // 栈底放#    printf("请输入括号:(以'#'结束)");    scanf("%c", &ch);    while (ch != '#')    {        if (ch == '(' || ch == '[')        // 左括号。压栈        {            push_link(mystack, ch);            printf("压栈:");            print(mystack);            printf("\n");        }         else        {            if (ch == ')' || ch == ']')            // 右括号,出栈            {                temp = top_link(mystack);                // 取栈顶元素                if ((temp == '(' && ch == ')') || (temp == '[' && ch == ']'))                {                    pop_link(mystack);                    printf("出栈:");                    print(mystack);                    printf("\n");                    //如果匹配,出栈                }                 else                {                    flag = 0;                    // 不匹配则设置标志位,跳出循环                    break;                }            }        }        scanf("%c", &ch);    }    if (!flag || top_link(mystack) != '#')    {        printf("匹配失败\n");        return FALSE;    }     else    {        printf("匹配成功\n");        return TRUE;    }}

main.c

#include <stdio.h>#include <stdlib.h>#include "linkstack.h"int main(){    PLinkStack mystack;    mystack = createEmptyStack_link();    BracketMatch(mystack);    return 0;}
0 0