标题:出栈的时候 出错 求大神解答 !!!急
只看楼主
li71
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2018-9-8
结帖率:100%
已结贴  问题点数:15 回复次数:14 
出栈的时候 出错 求大神解答 !!!急

#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  为什么是这样呢  求大神解答!


搜索更多相关主题的帖子:  top return 为空 printf 
2018-10-27 17:45
li71
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2018-9-8
得分:0 
程序第五步出错了应该是
2018-10-27 17:46
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:15 
你看一下里面的值吧

C果然是有点难啊!
2018-10-27 20:27
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
你看一下里面的值吧

C果然是有点难啊!
2018-10-27 20:27
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
这个读取字符的比较烦,因为回车键也算一个字符,下面有一些我的代码你可以参考一下,用的是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;
}



C果然是有点难啊!
2018-10-27 21:05
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
这个读取字符的比较烦,因为回车键也算一个字符,下面有一些我的代码你可以参考一下,用的是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;
}



C果然是有点难啊!
2018-10-27 21:05
li71
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2018-9-8
得分:0 
回复 6楼 MeandC
你这个使用c语言写的吗  大神  能不能在我的源程序上改动呀 你写的这个看不懂呀
2018-10-27 21:19
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
回复 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;
}

C果然是有点难啊!
2018-10-28 00:02
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
回复 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;
}

C果然是有点难啊!
2018-10-28 00:02
MeandC
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
回复 7楼 li71
你那个定义栈是静态的,而我一开始写的是动态存储的,栈满可以用realloc直接追加空间的。

C果然是有点难啊!
2018-10-28 00:21



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-490739-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.140703 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved