顺序栈
来源:互联网 发布: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
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- 顺序栈
- java对象拷贝——PropertyUtils.copyProperties()用法和性能
- Could not find method com.loopj.android.http.AsyncHttpResponseHandler
- git stash命令总结
- js事件详解
- Java编程:阿里巴巴的fastjson使用示例
- 顺序栈
- Day39:uu7
- 货币金额大写转换
- phpStorm 最新版激活方法[转]
- ProgressBar的使用
- Java 后台生成 JSONArray 树
- matlab 不显示特定legend2
- NT symbols are incorrect, please fix symbols
- 数据结构基础