编写一个测试程序,检查一个C语言程序中括号的配对情况。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写一个测试程序,检查一个C语言程序中括号的配对情况。相关的知识,希望对你有一定的参考价值。
要求:
1. 包括“、”和“(、)”以及[、]。
2. 利用堆栈将左括号入栈,遇到右括号时出栈进行匹配。
3. 给出相应的正确和错误信息。
4. 入栈和出栈函数分别为Push()和Pop()。
5. 结果输出到屏幕上和结果文件中。
typedef struct
DataType stack[MaxStackSize];
int top;
SeqStack;
void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/
S->top = 0; /*定义初始栈顶下标值*/
int StackNotEmpty(SeqStack S)
/*判顺序堆栈S非空否,非空则返回1,否则返回0*/
if(S.top <= 0) return 0;
else return 1;
int StackPush(SeqStack *S, DataType x)
/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */
if(S->top >= MaxStackSize)
printf("堆栈已满无法插入! \n");
return 0;
else
S->stack[S->top] = x;
S->top ++;
return 1;
int StackPop(SeqStack *S, DataType *d)
/*弹出顺序堆栈S的栈顶数据元素值到参数d ,出栈成功则返回1,否则返回0*/
if(S->top <= 0)
printf("堆栈已空无数据元素出栈! \n");
return 0;
else
S->top --;
*d = S->stack[S->top];
return 1;
int StackTop(SeqStack S, DataType *d)
/*取顺序堆栈S的当前栈顶数据元素值到参数d ,成功则返回1,否则返回0*/
if(S.top <= 0)
printf("堆栈已空! \n");
return 0;
else
*d = S.stack[S.top - 1];
return 1;
括号问题
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MaxStackSize 100
typedef char DataType;
#include "SeqStack.h"
void ExpIsCorrect(char exp[], int n)
//判断有n个字符的字符串exp左右括号是否配对正确
SeqStack myStack; //定义链式堆栈
int i;
char c;
StackInitiate(&myStack);
for(i = 0; i < n; i++)
if((exp[i] == '(') || (exp[i] == '[') || (exp[i] == ''))
StackPush(&myStack, exp[i]); //入栈
else if(exp[i] == ')' && StackNotEmpty(myStack)
&& StackTop(myStack, &c) && c == '(')
StackPop(&myStack, &c); //出栈
else if(exp[i] == ')' && StackNotEmpty(myStack)
&& StackTop(myStack, &c) && c != '(')
printf("左右括号配对次序不正确!\n");
return;
else if(exp[i] == ']' && StackNotEmpty(myStack)
&& StackTop(myStack, &c) && c == '[')
StackPop(&myStack, &c); //出栈
else if(exp[i] == ']' && StackNotEmpty(myStack)
&& StackTop(myStack, &c) && c != '[')
printf("左右括号配对次序不正确!\n");
return;
else if(exp[i] == '' && StackNotEmpty(myStack)
&& StackTop(myStack, &c) && c == '')
StackPop(&myStack, &c); //出栈
else if(exp[i] == '' && StackNotEmpty(myStack)
&& StackTop(myStack, &c) && c != '')
printf("左右括号配对次序不正确!\n");
return;
else if(((exp[i] == ')') || (exp[i] == ']') || (exp[i] == ''))
&& !StackNotEmpty(myStack))
printf("右括号多于左括号!\n");
return;
if(StackNotEmpty(myStack))
printf("左括号多于右括号!\n");
else
printf("左右括号匹配正确!\n");
void main(void)
char a[] = "(())abc[)(]"; //测试例子1。左右括号配对次序不正确
char b[] = "(()))abc[]"; //测试例子2。右括号多于左括号
char c[] = "(()()abc[]"; //测试例子3。左括号多于右括号
char d[] = "(())abc[]"; //测试例子4。左右括号匹配正确
int n1 = strlen(a);
int n2 = strlen(b);
int n3 = strlen(c);
int n4 = strlen(d);
ExpIsCorrect(a, n1);
ExpIsCorrect(b, n2);
ExpIsCorrect(c, n3);
ExpIsCorrect(d, n4);
二者放于同一目录下即可 参考技术A #include <stdio.h>
const int MAX_N=1000; //堆栈最大深度/文件最大长度
typedef struct
int top;
char data[MAX_N];
char Pop() //出栈
if(top<0) //堆栈为空
return -1;
else
return data[top--];
bool Push(char elem) //入栈
if(top==MAX_N-1) //堆栈满
return false;
else
data[++top]=elem;
return true;
char Peek() //查看栈顶元素
if(top<0) //堆栈为空
return -1;
else
return data[top];
Stack;
int main(int argc, char *argv[])
Stack stack;
char text[MAX_N],filename[MAX_N];
int i;
FILE *outfile;
printf("输入要匹配括号的文本:");
while(gets(text)!=NULL)
stack.top=-1;
for(i=0;text[i]!='\0';i++)
if(text[i]==''||text[i]=='('||text[i]=='[')
stack.Push(text[i]);
else if(text[i]==''||text[i]==')'||text[i]==']')
if((stack.Peek()==''&&text[i]=='')||(stack.Peek()=='('&&text[i]==')')||(stack.Peek()=='['&&text[i]==']'))
stack.Pop();
else
break;
printf("输入保存此次匹配结果的文件名:");
gets(filename);
outfile=fopen(filename,"w");
fprintf(outfile,"%s\n",text);
if(text[i]=='\0'&&stack.top==-1)
fprintf(outfile,"匹配成功!\n"),printf("匹配成功!\n");
else
fprintf(outfile,"匹配失败!\n"),printf("匹配失败!\n");
printf("输入要匹配括号的文本:");
return 0;
/*
测试数据:
int main() int data[];return
1.txt
for(i=0;i<N;i++)while(1)data[i]++
2.txt
[[[]]
3.txt
())
4.txt
()()((())
5.txt
*/
题目2-括号配对问题
描述现在,有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
- 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
- 样例输入
-
3 [(]) (]) ([[]()])
- 样例输出
-
No No Yes
1 #include<stdio.h> 2 #include<string> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 #define MaxSize 10000 8 typedef int ElemType; 9 typedef struct 10 { 11 ElemType data[MaxSize]; 12 int top; 13 }SqStack; 14 15 int InitStack(SqStack &S) 16 {//初始化顺序栈 17 memset(S.data, 0, MaxSize); 18 S.top = -1; 19 return 1; 20 } 21 22 int Push(SqStack &S,char ch) 23 {//字符进栈 24 if (S.top >= MaxSize) 25 return 0; 26 S.top++; 27 S.data[S.top] = ch; 28 return 1; 29 } 30 31 char Pop(SqStack &S) 32 {//字符出栈 33 char ch; 34 if (S.top < 0) 35 return 0; 36 ch = S.data[S.top]; 37 S.top--; 38 //printf("Pop:: %c", ch); 39 //printf("\n"); 40 return ch; 41 } 42 43 void OutputStack(SqStack S) 44 { 45 for (int i = S.top; i >= 0; i--) 46 printf("%c ", S.data[i]); 47 printf("\n"); 48 } 49 50 51 52 int main() 53 {//第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组 54 //输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空 55 //串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(", ")"四种字符 56 int N; 57 scanf("%d", &N); 58 getchar();//读取回车 59 60 string line; 61 int len, i, tag; 62 char now, temp; 63 SqStack S; 64 while (N--) 65 { 66 tag = 1; 67 getline(cin, line); 68 //cout << line << endl; 69 len = line.length();//读入一行括号,计算字符串长度 70 InitStack(S);//初始化栈的内容 71 for (i = 0; i < len; i++) 72 { 73 now = line[i]; 74 switch (now) 75 { 76 case ‘[‘:Push(S, now); break;//printf("成功入栈:: "); OutputStack(S); 77 case ‘(‘:Push(S, now); break;//printf("成功入栈:: "); OutputStack(S); 78 default:break; 79 } 80 81 if (now == ‘]‘) 82 { 83 temp = Pop(S); 84 //printf("temp:: %c", temp); 85 //printf("\n"); 86 if (temp == ‘[‘) 87 continue; 88 else 89 { 90 //printf("tag=0 :: "); 91 //OutputStack(S); 92 tag = 0; 93 break; 94 } 95 } 96 else if(now == ‘)‘) 97 { 98 temp = Pop(S); 99 //printf("temp:: %c", temp); 100 //printf("\n"); 101 if (temp == ‘(‘) 102 continue; 103 else 104 { 105 //printf("tag=0 :: "); 106 //OutputStack(S); 107 tag = 0; 108 break; 109 } 110 } 111 } 112 if (tag == 0) 113 { 114 printf("No\n"); 115 } 116 else if (tag == 1 && S.top == -1) 117 { 118 printf("Yes\n"); 119 } 120 else 121 { 122 printf("No\n"); 123 } 124 } 125 126 return 0; 127 } 128 //_CRT_SECURE_NO_WARNINGS
以上是关于编写一个测试程序,检查一个C语言程序中括号的配对情况。的主要内容,如果未能解决你的问题,请参考以下文章
试编写一个算法从检查一个Java语言中的大括号方括号小括号是不是配对,若能够全?