判断堆栈是否满或空

passion11 2013-07-26 11:15:03
/*
**
** 静态数组实现堆栈程序 a_stack.c ,数组长度由#define确定
*/

#include"stack.h"
#include<assert.h>
#include<stdio.h>

#define STACK_SIZE 100 /* 堆栈最大容纳元素数量 */

/*
** 存储堆栈中的数组和一个指向堆栈顶部元素的指针
*/
static STACK_TYPE stack[STACK_SIZE];
static int top_element = -1;

/* push */
void push(STACK_TYPE value)
{
assert(!is_full()); /* 压入堆栈之前先判断是否堆栈已满*/
top_element += 1;
stack[top_element] = value;
}

/* pop */
void pop(void)
{
assert(!is_empty()); /* 弹出堆栈之前先判断是否堆栈已空 */
top_element -= 1;
}

/* top */
STACK_TYPE top(void)
{
assert(!is_empty());
return stack[top_element];
}

/* is_empty */
int is_empty(void)
{
return top_element == -1;
}

/* is_full */
int is_full(void)
{
return top_element == STACK_SIZE - 1;
}
《c和指针》中的一个例子。
上面的程序中用 assert(!is_empty());判读堆栈是否为空,
assert(!is_full());判读堆栈是否为满,这可行吗????
!是逻辑非操作,只要assert的参数不为零,assert断言总是真的,就不会提示错误了
is_full返回值是STACK_SIZE - 1;大都会非零的值,那就表示真,!is_full()岂不是变成假了,
那断言不就总提示出错了吗??
...全文
1225 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
passion11 2013-08-14
  • 打赏
  • 举报
回复
引用 1 楼 songhtao 的回复:
assert一般都是在调试时用的 ,发布时 编译器 会去掉 。 top_element == STACK_SIZE - 1; top_element 等于 STACK_SIZE - 1; 的时候上面表达式才为1
是top_element 等于 STACK_SIZE - 1的时候上面表达式才为1 但是这不就是矛盾了吗,top_element 等于 STACK_SIZE - 1就表示堆栈已经满了, 不能再压人值了,应该提示出错才对,而表示继续走下面的入栈操作
passion11 2013-08-14
  • 打赏
  • 举报
回复
堆栈满的返回值是:STACK_SIZE - 1; 空的返回值是:-1
引用 2 楼 xiaoshi0 的回复:
1. 在C语言中没有bool的概念,所以int类型中0代表FALSE而非0都代表TRUE 2. 你的代码中没有看到assert的定义,一般来讲,assert都会定义为宏。所以我如果如下定义assert的话: #define assert(f) if (!f) return 如上所示,在编译时会将该宏展开到调用的地方,那么当条件表达式为0的时候自然就返回了,也就不会运行到后面。
堆栈满的返回值是:STACK_SIZE - 1; 空的返回值是:-1,只有存入一个值得时候才为0
xiaoshi0 2013-07-27
  • 打赏
  • 举报
回复
1. 在C语言中没有bool的概念,所以int类型中0代表FALSE而非0都代表TRUE 2. 你的代码中没有看到assert的定义,一般来讲,assert都会定义为宏。所以我如果如下定义assert的话: #define assert(f) if (!f) return 如上所示,在编译时会将该宏展开到调用的地方,那么当条件表达式为0的时候自然就返回了,也就不会运行到后面。
我不懂电脑 2013-07-26
  • 打赏
  • 举报
回复
assert一般都是在调试时用的 ,发布时 编译器 会去掉 。 top_element == STACK_SIZE - 1; top_element 等于 STACK_SIZE - 1; 的时候上面表达式才为1

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧