C/C++数据结构通过顺序栈实现括号()匹配算法

来源:互联网 发布:钢结构三维建模软件 编辑:程序博客网 时间:2024/06/05 06:09
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef char ElemType;
typedef int Status;
typedef struct stack//创建顺序栈
{
    ElemType  *base,*top;//栈底指针、栈顶指针
    int StackSize;//栈长度
}SQStack;


Status InitStack(SQStack* &S);//初始化栈
Status Push(SQStack* &S,ElemType e);//将元素e压入栈S
Status Pop(SQStack* &S,ElemType &e);//将元素e压出栈s




int main()
{
    SQStack* S = new stack;//创建顺序栈并申请空间
    InitStack(S);//初始化栈
    S->StackSize = 0;//初始化栈长度为0
    printf("请输入算术表达式:(将内容用括号()括起来\n");
    char ch;//从键盘读取的字符
    bool flag1 = true,flag2 = true;//两个bool变量分别对应匹配到左括号和又括号的标志
    ElemType elem[100];//存储括号内字符串
    while(flag1||flag2)//只有两个括号都读取到才可以跳出循环
    {
        ch = getch();//从键盘获取字符
        switch(ch)//检测输入内容是否有括号并等待匹配
        {
        case '('://检测到左括号就改变flag1
            printf("匹配到左括号\n");
            flag1 = false;
            break;
        case ')'://检测到右括号就改变flag2
            printf("匹配到右括号,匹配成功\n");
            flag2 = false;
            break;
        default://没有获取到左右括号的字符
            if(!flag1)//获取到左括号就开始入栈
            {
                S->StackSize++;
                Push(S,ch);
            }
        }printf("%c",ch);
    }
    printf("匹配成功\n");
    for(int i =0;i<S->StackSize ;i++)
    {
        Pop(S,elem[S->StackSize-i-1]);//匹配到右括号后出栈将栈元素保存到elem字符数组里并且是从后往前排
    }
    for(int i =0;i<S->StackSize ;i++)
        {
            printf("%c",elem[i]);//顺序输出字符数组,将栈内元素从栈底到栈顶输出
        }




    delete S;
    return 0;
}
Status InitStack(SQStack* &S)//初始化栈
{
    S->base = new ElemType[MAXSIZE];//构造一个空栈 空间最多能容纳MAXSIZE长度数组
    if(!S->base)exit(0);
    S->top = S->base;//top指针初始为base栈底,为空栈
    S->StackSize = 0;
    return OK;
}
Status Push(SQStack* &S,ElemType e)//将元素e压入栈S
{
    if((S->top - S->base)==S->StackSize)return ERROR;//判断栈是否满,满则返回ERROR
    S->top++;
    *S->top = e;//将e值存入top位置处,并s.top置栈顶


    return OK;
}
Status Pop(SQStack* &S,ElemType &e)//将元素e压出栈s
{
    if(S->top == S->base) return 0;//判断栈是否为空,若空则返回ERROR
    e = *(S->top);//将栈顶元素赋值给e将S栈顶指针移动到S下一位处为栈顶
    S->top--;
    return OK;
}