C语言程序设计现代方法K.N.KING第十章第一道编程题

修改书上的程序(片段):
#define STACK_SIZE 100
int contents[STACK_SIZE];
int top = 0;
void make_empty(void)
{
top = 0;
}
int is_empty(void)
{
return top==0;
}
int is_full(void)
{
return top==STACK_SIZE;
}
void push(int i)
{
if (is full()==STACK_SIZE)
stack_overflow();
else
contents[top++]=i;
}
int pop(void)
{
if (is_empty())
stack_underflow();
else
return contents [--top];
}

使得可以达到如下功能,要求用户输入一串圆括号或花括号,然后指出它们之间的嵌套是否正确:
Enter parenteses and/or braces:((){}{()})
parenteses and/or braces are nested properly
我对书上做了修改后如下,有三个警告,而且我觉得我的方法并不好。

#include
#define STACK_SIZE 100
char contents[STACK_SIZE];
int top = 0;
void make_empty(void)
{
top = 0;
}
int is_empty(void)
{
return top==0;
}
int is_full(void)
{
return top==STACK_SIZE;
}
void push(char i)
{
if (is_full()==STACK_SIZE)
stack_overflow();
else
contents[top++]=i;
}
char pop(void)
{
if (is_empty())
stack_underflow();
else
return contents [--top];
}

int main(void)
{
char ch;
int flag=0,flag1=0;
printf("Enter parenteses and/or braces:");
while(ch=getchar()!='\n'){
if(ch=='(' || ch=='{'){
void put(char ch);
}//压入ch进数组contents中
else if(ch==')' || ch=='}'){//如果输入是右括号的话,弹出栈顶以检测是否和输入的右括号配对
char pop(void);//弹出
if(contents[--top]=='('&&ch==')'||contents[--top]=='{'&&ch=='}')
flag=0;
else
flag++;
}
if(getchar()=='\n')
if(top==0)
flag1=0;
else
flag1++;
}
return 0;
}
警告如下:
D:\c\c\第十章程序结构\chapter10programming1.c(20) : warning C4013: 'stack_overflow' undefined; assuming extern returning int
D:\c\c\第十章程序结构\chapter10programming1.c(27) : warning C4013: 'stack_underflow' undefined; assuming extern returning int
D:\c\c\第十章程序结构\chapter10programming1.c(30) : warning C4715: 'pop' : not all control paths return a value

前两个警告就是没有定义函数实现,stack_overflow函数可以直接输出一句话提示栈满了并且exit(1)退出程序,stack_underflow可以输出一句提示空栈并且exit(1)退出程序。
pop函数的警告是因为is_empty()控制块如果为true时没有return 语句,而pop函数是要求返回char类型值的。
另外push函数is_full()函数返回的是0或者1所以不用和STACK_SIZE再次相等判断

警告说的是这个函数'stack_underflow' 没有定义,编译器假设你在外部有定义而且返回值是int。如果没有在外部定义,那么在连接的时候会出错

书上肯定是简单写的,一些简单函数什么的人家就懒得给全了,栈溢出函数你看你就随便写一个,报错啦或者直接终止程序就行了