注册 登录
编程论坛 数据结构与算法

出栈的时候 出错 求大神解答 !!!急

li71 发布于 2018-10-27 17:45, 3598 次点击

#include <iostream>
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
using namespace std;
typedef char ElemType;
typedef struct {

    ElemType data[MaxSize];//存取栈中的数据元素
    int top;//栈顶指针,即存放栈顶元素在data数组中的下标

}SqStack;//顺序栈类型
void InitStack(SqStack *&s)
{
      s=(SqStack*)malloc(sizeof(SqStack));//分配一个顺序栈空间,首地址存放在s中
      s->top=-1;//栈顶指针置为-1

}

void DestoryStack(SqStack *&s)
{
    free(s);

}

bool StackEmpty(SqStack *s)
{
    return ( s->top == -1 );

}



bool Push(SqStack *&s,ElemType e)
{
    if(s->top==MaxSize-1)//栈满的情况,即栈上溢出
        return false;
    s->top++;//栈顶指针增1
    s->data[s->top]=e;//元素e放在栈顶指针处
    return true;

}

bool Pop(SqStack *&s,ElemType &e)
{
  if(s->top==-1)//栈为空的情况,即栈下溢出
    return false;
  e=s->data[s->top];//取栈顶元素
  s->top--;//栈顶指针减1
  return true;
}


bool GetTop(SqStack *&s,ElemType &e)
{
    if(s->top==-1)//栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];//取栈顶元素
    return true;
}
int main()//主函数
{

    int n;
    int i;
    ElemType e;
    SqStack *sk;
    fflush(stdin);
    InitStack(sk);
    printf("(1)栈s已被初始化!\n");
    printf("(2)栈s");
    if(StackEmpty(sk))
        printf("为空栈!");
    else
        printf("不为空栈!");
    printf("\n");
    printf("(3)请输入元素的个数:");
    scanf("%d",&n);
    printf("请输入要入栈的元素:");

    for(i=0;i<n;i++)
    {
        scanf("%c",&e);
        Push(sk, e);
    }

    if(Push(sk,e))
        printf("入栈成功");
    else{
        printf("入栈不成功");
    }
    printf("\n");
    printf("(4)栈s");
    if(StackEmpty(sk))
        printf("为空栈!");
    else{
        printf("不为空栈!");
      }
    printf("\n");
    printf("(5)栈s的出栈序列为");
  
    while(!(StackEmpty(sk)))
    {
        Pop(sk,e);
        printf("%c",e);

    }

    printf("\n");
    printf("(6)栈s");
     if(StackEmpty(sk))
        printf("为空栈!");
    else{
        printf("不为空栈!");
    }
        printf("\n");
    DestoryStack(sk);
    printf("(7)栈s已被释放!");

}




只有本站会员才能查看附件,请 登录

出栈的时候应该是edcba  为什么是这样呢  求大神解答!


14 回复
#2
li712018-10-27 17:46
程序第五步出错了应该是
#3
MeandC2018-10-27 20:27
你看一下里面的值吧
只有本站会员才能查看附件,请 登录
#4
MeandC2018-10-27 20:27
你看一下里面的值吧
只有本站会员才能查看附件,请 登录
#5
MeandC2018-10-27 21:05
这个读取字符的比较烦,因为回车键也算一个字符,下面有一些我的代码你可以参考一下,用的是vs,你不是vs的话可以把scanf_s改回scanf。

程序代码:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
typedef struct {
    char *base;
    char *top;
    int stacksize;
}sqstack;
int initsqstack(sqstack &s)
{
    s.base = (char*)malloc(sizeof(char)*SIZE);
    if (!s.base)exit(-2);//退出程序
    s.top = s.base;
    s.stacksize = SIZE;
    return 1;
}

int main(void)
{
    sqstack s;
    initsqstack(s);

    int n;
    scanf_s("%d", &n);
    int i;
    char c;
    for (i = 0; i <n; i++) {
        scanf_s("%*c%c", &c);//空格隔开或者逗号隔开,或者回车输入不同胡字符
        *s.top++ = c;//进栈
    }

    for (i = 0; i < n; i++) {
        if (s.top != s.base)
            c = *--s.top;//出栈
        printf("%c ", c);
    }

    system("pause");
    return 0;
}


只有本站会员才能查看附件,请 登录
#6
MeandC2018-10-27 21:05
这个读取字符的比较烦,因为回车键也算一个字符,下面有一些我的代码你可以参考一下,用的是vs,你不是vs的话可以把scanf_s改回scanf。

程序代码:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
typedef struct {
    char *base;
    char *top;
    int stacksize;
}sqstack;
int initsqstack(sqstack &s)
{
    s.base = (char*)malloc(sizeof(char)*SIZE);
    if (!s.base)exit(-2);//退出程序
    s.top = s.base;
    s.stacksize = SIZE;
    return 1;
}

int main(void)
{
    sqstack s;
    initsqstack(s);

    int n;
    scanf_s("%d", &n);
    int i;
    char c;
    for (i = 0; i <n; i++) {
        scanf_s("%*c%c", &c);//空格隔开或者逗号隔开,或者回车输入不同胡字符
        *s.top++ = c;//进栈
    }

    for (i = 0; i < n; i++) {
        if (s.top != s.base)
            c = *--s.top;//出栈
        printf("%c ", c);
    }

    system("pause");
    return 0;
}


只有本站会员才能查看附件,请 登录
#7
li712018-10-27 21:19
回复 6楼 MeandC
你这个使用c语言写的吗  大神  能不能在我的源程序上改动呀 你写的这个看不懂呀
#8
MeandC2018-10-28 00:02
回复 7楼 li71
你输入5时按的回车键也被读取了,还有你判断是否进栈时就把最后一个输入的多进了一次栈,所以两个d,帮你改了两处,加了个输入语句加了%*c和删了你的if语句。
我用的vs,你可以把scanf_s改回成scanf。
只有本站会员才能查看附件,请 登录


程序代码:
#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MaxSize 100
using namespace std;
typedef char ElemType;
typedef struct {

    ElemType data[MaxSize];//存取栈中的数据元素
    int top;//栈顶指针,即存放栈顶元素在data数组中的下标

}SqStack;//顺序栈类型
void InitStack(SqStack *&s)
{
    s = (SqStack*)malloc(sizeof(SqStack));//分配一个顺序栈空间,首地址存放在s中
    s->top = -1;//栈顶指针置为-1

}

void DestoryStack(SqStack *&s)
{
    free(s);

}

bool StackEmpty(SqStack *s)
{
    return (s->top == -1);

}



bool Push(SqStack *&s, ElemType e)
{
    if (s->top == MaxSize - 1)//栈满的情况,即栈上溢出
        return false;
    s->top++;//栈顶指针增1
    s->data[s->top] = e;//元素e放在栈顶指针处
    return true;

}

bool Pop(SqStack *&s, ElemType &e)
{
    if (s->top == -1)//栈为空的情况,即栈下溢出
        return false;
    e = s->data[s->top];//取栈顶元素
    s->top--;//栈顶指针减1
    return true;
}


bool GetTop(SqStack *&s, ElemType &e)
{
    if (s->top == -1)//栈为空的情况,即栈下溢出
        return false;
    e = s->data[s->top];//取栈顶元素
    return true;
}
int main()//主函数
{

    int n;
    int i;
    ElemType e;
    SqStack *sk;
    fflush(stdin);
    InitStack(sk);
    printf("(1)栈s已被初始化!\n");
    printf("(2)栈s");
    if (StackEmpty(sk))
        printf("为空栈!");
    else
        printf("不为空栈!");
    printf("\n");
    printf("(3)请输入元素的个数:");
    scanf_s("%d", &n);
    printf("请输入要入栈的元素:");

    for (i = 0; i < n; i++)
    {
        scanf_s("%*c%c", &e);
        Push(sk, e);
    }//输入个数n是按了一下回车会被读取和存入,%*c可以读取一个但是不存,相当于跳过一个字符
   
//下面的判断语句会是最后一个读取的那个数再进一次栈,所以就有两个d了
   
//if (Push(sk, e))
   
//    printf("入栈成功");
   
//else {
        
//printf("入栈不成功");
   
//}
    printf("\n");
    printf("(4)栈s");
    if (StackEmpty(sk))
        printf("为空栈!");
    else {
        printf("不为空栈!");
    }
    printf("\n");
    printf("(5)栈s的出栈序列为");

    while (!(StackEmpty(sk)))
    {
        Pop(sk, e);
        printf("%c", e);

    }

    printf("\n");
    printf("(6)栈s");
    if (StackEmpty(sk))
        printf("为空栈!");
    else {
        printf("不为空栈!");
    }
    printf("\n");
    DestoryStack(sk);
    printf("(7)栈s已被释放!");
    system("pause");//暂停,停住运行窗口防止一闪而过
    return 0;
}
#9
MeandC2018-10-28 00:02
回复 7楼 li71
你输入5时按的回车键也被读取了,还有你判断是否进栈时就把最后一个输入的多进了一次栈,所以两个d,帮你改了两处,加了个输入语句加了%*c和删了你的if语句。
我用的vs,你可以把scanf_s改回成scanf。
只有本站会员才能查看附件,请 登录


程序代码:
#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MaxSize 100
using namespace std;
typedef char ElemType;
typedef struct {

    ElemType data[MaxSize];//存取栈中的数据元素
    int top;//栈顶指针,即存放栈顶元素在data数组中的下标

}SqStack;//顺序栈类型
void InitStack(SqStack *&s)
{
    s = (SqStack*)malloc(sizeof(SqStack));//分配一个顺序栈空间,首地址存放在s中
    s->top = -1;//栈顶指针置为-1

}

void DestoryStack(SqStack *&s)
{
    free(s);

}

bool StackEmpty(SqStack *s)
{
    return (s->top == -1);

}



bool Push(SqStack *&s, ElemType e)
{
    if (s->top == MaxSize - 1)//栈满的情况,即栈上溢出
        return false;
    s->top++;//栈顶指针增1
    s->data[s->top] = e;//元素e放在栈顶指针处
    return true;

}

bool Pop(SqStack *&s, ElemType &e)
{
    if (s->top == -1)//栈为空的情况,即栈下溢出
        return false;
    e = s->data[s->top];//取栈顶元素
    s->top--;//栈顶指针减1
    return true;
}


bool GetTop(SqStack *&s, ElemType &e)
{
    if (s->top == -1)//栈为空的情况,即栈下溢出
        return false;
    e = s->data[s->top];//取栈顶元素
    return true;
}
int main()//主函数
{

    int n;
    int i;
    ElemType e;
    SqStack *sk;
    fflush(stdin);
    InitStack(sk);
    printf("(1)栈s已被初始化!\n");
    printf("(2)栈s");
    if (StackEmpty(sk))
        printf("为空栈!");
    else
        printf("不为空栈!");
    printf("\n");
    printf("(3)请输入元素的个数:");
    scanf_s("%d", &n);
    printf("请输入要入栈的元素:");

    for (i = 0; i < n; i++)
    {
        scanf_s("%*c%c", &e);
        Push(sk, e);
    }//输入个数n是按了一下回车会被读取和存入,%*c可以读取一个但是不存,相当于跳过一个字符
   
//下面的判断语句会是最后一个读取的那个数再进一次栈,所以就有两个d了
   
//if (Push(sk, e))
   
//    printf("入栈成功");
   
//else {
        
//printf("入栈不成功");
   
//}
    printf("\n");
    printf("(4)栈s");
    if (StackEmpty(sk))
        printf("为空栈!");
    else {
        printf("不为空栈!");
    }
    printf("\n");
    printf("(5)栈s的出栈序列为");

    while (!(StackEmpty(sk)))
    {
        Pop(sk, e);
        printf("%c", e);

    }

    printf("\n");
    printf("(6)栈s");
    if (StackEmpty(sk))
        printf("为空栈!");
    else {
        printf("不为空栈!");
    }
    printf("\n");
    DestoryStack(sk);
    printf("(7)栈s已被释放!");
    system("pause");//暂停,停住运行窗口防止一闪而过
    return 0;
}
#10
MeandC2018-10-28 00:21
回复 7楼 li71
你那个定义栈是静态的,而我一开始写的是动态存储的,栈满可以用realloc直接追加空间的。
#11
li712018-10-28 08:33
回复 10楼 MeandC
刚看到    感谢大神  但是我还是有个疑问  那个输出入栈成功假如要是没删就出现两个e  这是为啥呀
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
这是两张对比的图 帮忙看看  谢谢啦

[此贴子已经被作者于2018-10-28 08:35编辑过]

#12
li712018-10-28 08:59
回复 10楼 MeandC
老哥  我找到了一个解决方法  但是 不太明白   把Push和scanf 那两个互换一下位置  不删那个入栈成功语句   也能成功执行  这是为啥呀   能不能推荐一个看执行步骤最本质的软件呀   你之前看出是把回车也算进去了  咋看出来的呀   求教  哈哈
只有本站会员才能查看附件,请 登录
#13
MeandC2018-10-28 11:43
回复 12楼 li71
这样不好吧,if执行的时候才把最后一个e元素进栈,你栈里有六个元素,后面五个元素才是字母。你可以设置断点,然后就能看变量的值了,跟着程序一步一步走,编译器都可以设置断点吧,一行代码最前面点一下出现一个点就可以设置断点了,执行到这里就会停下来,然后可以看变量的值或者执行下一步。
你可以下载visual studio 2017 community版本,也就是社区版,微软官网下载,这个版本是免费而且可以选择安装中文版,功能强大,怎么安装使用的话,不懂可以百度的。
#14
li712018-10-28 12:50
回复 13楼 MeandC
啥意思     不能互换位置  
#15
li712018-10-28 12:57
回复 13楼 MeandC
将Push 和scanf  换位置不对?
1