顺序栈十—八进制转换的一些问题

qq_45729765 2019-10-09 09:15:07
//程序无法运行 如何修改 //push函数中的最后一句*S.top++=e;有问题 //access violation writing location #include<stdio.h> #include<iostream> using namespace std; //栈的顺序存储表示 #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配量 #define SElemType int typedef struct{ SElemType *base; //在栈构之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack; void InitStack(SqStack &S) { //构造一个空栈 S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base){ cout<<"error"<<endl;} //存储分配失败 else{ S.base=S.top; S.stacksize=STACK_INIT_SIZE; } //创建空栈即可,由push赋值 } void Pop(SqStack &S,SElemType &e){ //若栈不空,则删除S的栈顶元素,用e返回其值 if(S.top==S.base) cout<<"error"<<endl; else { e=*--S.top; } }//Pop void Push(SqStack &S,SElemType e){ //插入元素e为新的栈顶元素 if(S.top-S.base>=S.stacksize){ //栈满,追加存储空间 S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) {cout<<"error"<<endl;} //存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; }//Push int StackEmpty(SqStack &S) { if(S.top==S.base) return 1; else return 0; } int main() { int N; SElemType e; while(scanf("%d",&N)!=EOF) { SqStack S1; InitStack(S1);//构造空栈 while(N) { Push(S1,N%8); //进栈 N=N/8; } while(!StackEmpty(S1)){ Pop(S1,e); printf("%d",e); } } return 0; }
...全文
78 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-10-10
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
自信男孩 2019-10-10
  • 打赏
  • 举报
回复
//程序无法运行    如何修改
//push函数中的最后一句*S.top++=e;有问题
//access violation writing location

//#include <stdio.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;
//栈的顺序存储表示
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配量
#define SElemType int

typedef struct{
SElemType *base; //在栈构之前和销毁之后,base的值为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;

void InitStack(SqStack &S)
{
S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) {
cout<<"error"<<endl;
exit(0);
}
//S.base = S.top;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}


void Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base) {
cout<<"error"<<endl;
return;
}
e=*--S.top;

}

void Push(SqStack &S, SElemType e)
{
printf("%s, %p, %p\n", __func__, S.base, S.top);
int type_len = sizeof(SElemType);
if((S.top - S.base) / type_len >=S.stacksize) { //栈满,追加存储空间
S.base = (SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) {
cout<<"error"<<endl;
exit(0);
}

//S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}

*S.top++=e;

}


int StackEmpty(SqStack &S)
{
if(S.top==S.base)
return 1;
else
return 0;
}

int main()
{
int N;
SElemType e;
SqStack S1;
printf("%s, %p, %p\n", __func__, S1.base, S1.top);
InitStack(S1);

printf("%s, %p, %p\n", __func__, S1.base, S1.top);
while(scanf("%d", &N) != EOF)
{
while (N) {
Push(S1, N%8); //进栈
N=N/8;
}

while(!StackEmpty(S1)) {
Pop(S1,e);
printf("%d",e);
}
}

return 0;
}


供参考~

你的程序出现段错误主要是一个地方出现了问题,就是初始化栈的一条语句:

    //S.base = S.top;
S.top = S.base;

我也找了很长时间才发现。
自己对比一下,找找自己的其他问题~
铖邑 2019-10-10
  • 打赏
  • 举报
回复
请跟踪指针的取值是否合理
qq_45729765 2019-10-10
  • 打赏
  • 举报
回复
引用 2 楼 SuperDay的回复:
我有个疑惑很不解,楼主的C语言水平很高,敢这么用*.++操作,这样的自信是出于什么目的呢?炫技吗?为什么不能分开写呢?
分开写试过了,也不行
铖邑 2019-10-10
  • 打赏
  • 举报
回复
我有个疑惑很不解,楼主的C语言水平很高,敢这么用*.++操作,这样的自信是出于什么目的呢?炫技吗?为什么不能分开写呢?
铖邑 2019-10-10
  • 打赏
  • 举报
回复
我有个疑惑很不解,楼主的C语言水平很高,敢这么用*.++操作,这样的自信是出于什么目的呢?炫技吗?为什么不能分开写呢?
wowpH 2019-10-09
  • 打赏
  • 举报
回复
最厌恶的语言C+,没有之一

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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