|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
如图,在重新分配空间增加了10之后不应该是在top上增加了10空间吗?为什么top与base之差为10?
源代码如下
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- typedef struct //创建一个栈
- {
- char * base; //栈底 由于栈存放的是char型数据,指针类型也应为char*型
- char * top; //栈顶
- int stacksize; //栈的容量
- }Sqstack2;
- void initstack(Sqstack2*s) //栈的初始化函数
- {
- s->base = (char*)malloc(20 * sizeof(char)); //开始时申请20块连续的内存单元
- if (!s->base) //检测内存是否分配成功
- {
- exit(0);
- }
- s->top = s->base; //开始是为空栈,栈顶和栈底的地址相同
- s->stacksize = 20; //分配内存成功后更新栈的容量
- }
- void push(Sqstack2*s,char x) //入栈函数
- {
- if (s->top - s->base >= s->stacksize) //先检测是否发生上溢
- {
- s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char)); //若发生,则增加10个内存空间(动态扩容)
- if (!s->base) //检测内存是否分配成功
- {
- exit(0);
- }
- s->stacksize = s->stacksize + 10;
- s->top = s->base + 10;
- }
- *(s->top) = x; //开始将数据存入栈中
- s->top++; //存入一个数据,栈顶的地址相应增加(top位于最外侧数据的上一个单元)
- }
- void pop(Sqstack2*s, char * x) //出栈函数
- {
- if (s->top == s->base) //检测是否发生下溢
- {
- return;
- }
- s->top--;
- * x = *(s->top); //利用指针将数据传出
- }
- int stacklen(Sqstack2*s) //计算栈中元素个数函数
- {
- return (s->top - s->base); //这里并不是将地址相减,而是以char位单位计算元素个数
- }
- int main()
- {
- char c;
- Sqstack2 * s = (Sqstack2*)malloc(sizeof(Sqstack2)); //申请一块Sqstack类型的内存的单元并用指针s存放此单元的地址
- int len, i, sum = 0;
- initstack(s); //先将栈初始化
- printf("请输入二进制数:");
- c=getchar(); //输入数字
- while (c != '#') //当输入#时表示输入完毕
- {
- push(s, c); //将输入的数字入栈
- c=getchar(); //继续输入下一个数字
- }
- len = stacklen(s); //len表述栈中元素个数
- for (i = 0; i < len; i++)
- {
- pop(s, &c); //将元素出栈,函数用指针将数值赋值到c上
- sum = sum + (c - 48)*pow(2, i); //查看ASCII码,用c-48将数字由char型转换为int型,并进行数学运算
- }
- printf("您所要的结果是:%d", sum);
- return 0;
- }
复制代码
栈底不是重新分配空间了吗?
- if (s->top - s->base >= s->stacksize) //先检测是否发生上溢
- {
- s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char)); //若发生,则增加10个内存空间(动态扩容)
- if (!s->base) //检测内存是否分配成功
- {
- exit(0);
- }
- s->stacksize = s->stacksize + 10;
- s->top = s->base + 10; // 这里是因为栈发生上溢,栈底已经在上面重新分配了
- }
复制代码
|
|