PTA-栈(括弧匹配)
程序员文章站
2022-05-17 23:49:43
#include using namespace std; #define STACK_INIT_SIZE 10000 #define STACKINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #defi ......
#include<bits/stdc++.h> using namespace std; #define stack_init_size 10000 #define stackincrement 10 #define true 1 #define false 0 #define ok 1 #define error 0 #define infeasible -1 #define overflow -2 using namespace std; typedef char selemtype, status; typedef struct { selemtype *base; selemtype *top; int stacksize; }sqstack; status initstack(sqstack &s) { s.base = (selemtype *)malloc(sizeof(selemtype)*stack_init_size); if (!s.base) exit(overflow); s.top = s.base; s.stacksize = stack_init_size; return ok; } status push(sqstack &s, selemtype e) { if (s.top - s.base >= s.stacksize) { s.base = (selemtype*)malloc(sizeof(selemtype)*(s.stacksize + stackincrement)); if (!s.base) exit(overflow); s.top = s.base + s.stacksize; s.stacksize += stackincrement; } *s.top++ = e; return ok; } status pop(sqstack &s) { if (s.top == s.base) return error; s.top--; return ok; } status gettop(sqstack &s, selemtype &e) { if (s.base == s.top) return error; e = *(s.top - 1); return ok; } status empty(sqstack s) { if (s.top == s.base) return ok; else return error; } const int maxn = 1000 + 5; char s[maxn]; bool find(sqstack &s, char ch) { char tmp[maxn]; //初始化为“\n”; memset(tmp, '\n', sizeof(tmp)); //memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’; int num = 0; while (!empty) { selemtype e2; gettop(s, e2); if (e2 == ch) { pop(s); for (int i = num - 1; i >= 0; i--) push(s, tmp[i]); return true; } else { tmp[num++] = e2; } pop(s); } for (int i = num - 1; i >= 0; i--) push(s, tmp[i]); return false; } void judge(char ch) { if (ch == '(') printf("(-?\n"); else if (ch == '[') printf("[-?\n"); else if (ch == '{') printf("{-?\n"); else if (ch == '<') printf("/*-?\n"); } void fun(sqstack &sta, char ch) { int flag = 1;; if (!empty(s) { selemtype e; gettop(sta, e); if (e == '(') pop(sta); else if (flag) { printf("no\n"); flag = 0; judge(e); } } } int main() { sqstack sta; initstack(sta); int flag = 1; while (gets(s)) { if (s[0] == '.') break; int len = strlen(s); for (int i = 0; i < len; i++) { if (s[i] == '(' || s[i] == '[' || s[i] == '{') push(sta, s[i]); else if (s[i] == '/'&&s[i + 1] == '*'&&i + 1 < len) { ++i; push(sta, '<'); } else if (s[i] == ')') { if (!empty(sta) { selemtype e; gettop(sta, e); if (e == '(') pop(sta); else if (flag) { printf("no\n"); flag = 0; judge(e); } } else if (flag) { flag = 0; printf("no\n"); printf("?-)\n"); } } else if (s[i] == ']') { if (!empty(sta) { selemtype e; gettop(sta, e); if (e == '[') pop(sta); else if (flag) { printf("no\n"); flag = 0; judge(e); } } else if (flag) { flag = 0; printf("no\n"); printf("?-]\n"); } } else if (s[i] == '}') { if (!empty(sta) { selemtype e; gettop(sta, e); if (e == '{') pop(sta); else if (flag) { printf("no\n"); flag = 0; judge(e); } } else if (flag) { flag = 0; printf("no\n"); printf("?-}\n"); } } else if (s[i] == '*'&&s[i + 1] == '/'&&i + 1 < len) { ++i; if (!empty(sta) { selemtype e; gettop(sta, e); if (e == '<') pop(sta); else if (flag) { printf("no\n"); flag = 0; judge(e); } } else if (flag) { flag = 0; printf("no\n"); printf("?-*/\n"); } } } } if (flag) { if (!empty(sta) printf("yes\n"); else { selemtype e; gettop(sta, e); printf("no\n"); judge(e); } } }
7-2 符号配对 (20 分)
请编写程序检查c语言源程序中下列符号是否配对:/*
与*/
、(
与)
、[
与]
、{
与}
。
输入格式:
输入为一个c语言源程序。当读到某一行中只有一个句点.
和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。
输出格式:
首先,如果所有符号配对正确,则在第一行中输出yes
,否则输出no
。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号
;如果缺少右符号,则输出左符号-?
。
输入样例1:
void test() { int i, a[10]; for (i=0; i<10; i++) /*/ a[i] = i; } .
输出样例1:
no /*-?
输入样例2:
void test() { int i, a[10]; for (i=0; i<10; i++) /**/ a[i] = i; }] .
输出样例2:
no ?-]
输入样例3:
void test() { int i double a[10]; for (i=0; i<10; i++) /**/ a[i] = 0.1*i; } .
输出样例3:
yes
上一篇: PHP二维数组按照键值排序