顺序栈

来源:互联网 发布:360云盘mac版怎么用 编辑:程序博客网 时间:2024/06/09 21:00

问题描述

设计算法判断一个算数表达式的圆括号是否正确匹配.


思路

不难想到,这里存储括号用栈(先进后出)比较好。又因为存储的是字符,所以用顺序栈最为合理。(如果用链栈,一个节点存储一个字符,一个字符占一个字节,而一个地址占用4个字节,不合理)
对表达式进行扫描,凡遇到’(’就入栈,遇到’)’就将栈顶元素‘(’出栈;表达式被扫描完毕,栈应为空。


代码

#include <stdio.h>#include <malloc.h>#include <string.h>#define maxlen 100typedef struct{    char data[maxlen];    int top;}SeqStack;//建空栈SeqStack * SetStack(){    SeqStack * S;    S = (SeqStack *)malloc(sizeof(SeqStack));    S->top = -1;    return S;}//判栈空int StackEmpty(SeqStack * S){    if (S->top >= 0)        return 0;    else        return 1;}//判栈满int StackFull(SeqStack *S){    if (S->top< maxlen-1 && S->top >=0)        return 0;    else        return 1;}//取栈顶元素char getTop(SeqStack *S){    if (S->top <= maxlen-1 && S->top >= 0)        return (S->data[S->top]);    else printf("error");}//入栈void Push(SeqStack * S, char x){    if (S->top < maxlen-1 && S->top >= -1)    {        S->top++;        S->data[S->top] = x;    }    else        printf("error");}//出栈void Pop(SeqStack * S){    if (S->top >= 0)        S->top--;    else        printf("error");}//判断左括号int isLeftBracket(char ch) {    if (ch == '(')        return 1;    else        return 0;}//判断右括号int isRightBracket(char ch) {    if (ch == ')')        return 1;    else        return 0;}int check(SeqStack * S, char str[]){    int i;    int len = strlen(str);    for (i = 0; i < len; ++i)    {        if (isLeftBracket(str[i]))            Push(S, str[i]);        else if (isRightBracket(str[i]))        {            if (StackEmpty(S))                return 0;            else                Pop(S);        }    }    if (StackEmpty(S))        return 1;    else        return 0;}int main(void){    char str[maxlen];    scanf("%s", str);    SeqStack *S = SetStack();    if (check(S, str))        printf("算数表达式的圆括号匹配正确\n");    else        printf("算数表达式的圆括号匹配错误\n");    return 0;}

运行结果

这里写图片描述

这里写图片描述

0 0