有一段时间没写博客啦!今天来分享我的经验,希望对大家的编程之路有用!
今天我在学数据结构栈部分里的栈的应用之括号匹配,不幸的是调bug调很久啦!
第一部分写的是进制的转换,第二部分是括号匹配。
在进行执行代码的时候,第二部分的gets_s始终不执行,相当于空语句一样,我一开始怀疑我的另一个文件里“栈的应用_后缀表达式”,里的gets_s()的使用,随即我立即注释掉,但还是不起任何作用。我再换一种思路,把本源程序文件里的gets_s()换成scanf语句并执行,结果是可以执行scanf并等待我输入。
接着我又换回原来的gets_s(),还是不行,后面我百度没有发现有此类问题的解答,我觉得台太不科学啊!调试一下是不执行的,直接跳过的。
接着我就把第一部分进制转换 的代码注释掉,果然再执行的时候是等待我输入的,说明gets_s()执行啦!
好啦!感谢你听我说这么多废话,到这里来相信你已经知道问题所在啦!是的
在vs2019里一个源程序文件里若前面有scanf的输入语句时后面的gets_s()是不起任何作用的,本人亲自测试过,
不信你自己试试,其他编译器我就不知道,想知道结果自己试试不就知道啦!哈哈哈
下面附上本人源代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
typedef int SElemType;
typedef char ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define MAXSIZE 30
#define len sizeof(struct Stack)
typedef struct Stack
{
SElemType* data;
int top;
}SqStack;
typedef struct Stackfloat
{
ElemType* data;
int top;
}SqStackFloat;
void initStack(SqStack*& S);
void initStackfloat(SqStackFloat& S);
//DestroyStack(*S);
//ClearStack(*S);
Status StackEmpty(SqStack* S);
Status StackEmpty(SqStackFloat* S);
Status GetTop(SqStack S, SElemType& e);
Status Push(SqStack* S, SElemType e);
Status Pop(SqStack* S, SElemType* e);
void PrintStack(SqStack* S);
Status StackLength(SqStack* S);
void convert(int number, SqStack* S);
Status match(SqStackFloat* S, char* str);
int main()
{
SqStack wan;
SqStackFloat zhipeng;
SqStack* STheadboss = &wan;
SElemType x;
SElemType j;
ElemType string1[MAXSIZE];
SElemType exp[MAXSIZE], postexp[MAXSIZE];
printf("对栈进行初始化:\n");
initStack(STheadboss);
Sleep(300);
if (StackEmpty(STheadboss) == OK)
printf("栈空\n");
else
printf("栈非空\n");
Sleep(500);
printf("进栈测试:\n");
printf("输入要转换的十进制数:");
//scanf("%d", &x);
convert(15, STheadboss);
Sleep(500);
printf("打印该栈结果如下:");
PrintStack(STheadboss);
printf("此时栈长为%d\n", StackLength(STheadboss));
printf("对栈再次进行初始化:\n");
initStackfloat(zhipeng);
if (StackEmpty(&zhipeng) == OK)
printf("栈空\n");
else
printf("栈非空\n");
//scanf("%s", string1);//不执行就为空
gets_s(string1);
if (match(&zhipeng, string1) == ERROR)
printf("匹配失败!");
return 0;
}
void initStack(SqStack*& S)
{
S->data = (SElemType*)malloc(MAXSIZE);
S->top = -1;
}
void initStackfloat(SqStackFloat& S)
{
S.data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
S.top = -1;
}
Status StackEmpty(SqStack* S)
{
if (S->top == -1)//非指针
return TRUE;
else
return FLASE;
}
Status StackEmpty(SqStackFloat* S)
{
if (S->top == -1)//非指针
return TRUE;
else
return FLASE;
}
void PrintStack(SqStack* S)
{
int sum = S->top;
printf("顺序栈结果为:");
while (sum != -1)
{
printf("%d", S->data[sum--]);
}
printf("\n");
}
Status StackLength(SqStack* S)
{
return S->top + 1;
}
//二进制转换
void convert(int number, SqStack* S)
{
while (number)
{
S->data[++S->top] = number % 2;
number = number / 2;
}
S->data[++S->top] = number;
}
//括号匹配
Status match(SqStackFloat* S, char* str)
{
int i = 0, flag=0;
char ch = str[i],e;
while (ch != '\0')
{
switch (ch)
{
case '(':
S->data[++S->top] = ch;
break;
case '[':
S->data[++S->top] = ch;
break;
case '{':
S->data[++S->top] = ch;
break;
case ')':
e=S->data[S->top--] ;
if (e != '(')
flag = 1;
break;
case ']':
e = S->data[S->top--];
if (e != '[')
flag = 1;
break;
case '}':
e = S->data[S->top--];
if (e != '{')
flag = 1;
break;
default:
break;
}
if (flag)
return ERROR;
i++;
ch = str[i];
}
if (!flag && S->top == -1)
{
printf("匹配成功wanzhipeng!\n");
return OK;
}
else
{
return FLASE;
}
}