| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 538 人关注过本帖
标题:请教一下我这个栈始终都有逻辑问题求最完美的算法能在任何时候都知道栈的最 ...
只看楼主 加入收藏
weiziyi0530
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
请教一下我这个栈始终都有逻辑问题求最完美的算法能在任何时候都知道栈的最大值
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
#define OVERFLOW -1
#define OK 1
#define ERROR -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
    int *base;
    int *top;
    int stacksize;
}SqStack;
int InitStack(SqStack &S){
    S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));
    if(!S.base )exit(OVERFLOW);
    S.top =S.base ;
    S.stacksize =STACK_INIT_SIZE;
    return OK;
}
int Push(SqStack &S,int e){
    if(S.top -S.base>=S.stacksize  ){
        S.base =(int *)realloc(S.base ,(S.stacksize +STACKINCREMENT)*sizeof(int));
        if(!S.base )exit(OVERFLOW);
        S.top =S.base +S.stacksize ;
        S.stacksize +=STACKINCREMENT;
    }
    *S.top ++=e;
    return OK;
}
int Pop (SqStack &S, int &e) {
     // 若栈不空,则删除S的栈顶元素,
     // 用 e 返回其值,并返回OK;
     // 否则返回ERROR
    if (S.top == S.base) return ERROR;
    e = *--S.top;
    return OK;
}
int StackEmpty (SqStack S) {
    return (S.top ==S.base );
}
int GetTop(SqStack &S,int &e){
    if(S.top ==S.base )return ERROR;
    e=*(S.top -1);
    return OK;
}
void main(){
    int e,e_max,status=0;
    SqStack S,S_max;
    InitStack(S);
    InitStack(S_max);
    printf("请输入数值,当值为正时压栈,当值为负数时弹栈,当值为0时退出。\n");
    while(e){
        scanf("%d",&e);
        if(e>0){
            Push(S,e);        //压栈
            if(S_max.top ==S_max.base ){//当栈为空
                Push(S_max,e);//把e压栈,此时e为第一个元素
                printf("最大值为:%d\n",e);}
            else{
                GetTop(S_max,e_max);
                if(e>e_max){
                    Push(S_max,e);
                    printf("最大值为:%d\n",e);}
                else if(e<e_max){
                    printf("最大值为:%d\n",e_max);}
            }
        }
        else if(e<0){
            if(S.top ==S.base ){printf("栈为空\n");}
            else{
                GetTop(S,e);//S不空
                Pop(S,e);//退栈后判断S是只有一个元素还是几个元素
                if(S.top ==S.base ){//当原来的S中只有一个元素时
                    GetTop(S_max,e_max);
                Pop(S_max,e_max);
                printf("栈为空");}
                else{//当原来S中有两个及多个元素时
                    GetTop(S_max,e_max);
                    if(e==e_max){//如果退栈的元素等于最大值
                        Pop(S_max,e_max);
                    GetTop(S_max,e_max);
                    printf("最大值为:%d\n",e_max);}
                    else{
                        printf("最大值为:%d\n",e_max);}
                }
            }
        }
        else if(e==0){OVERFLOW;}
        status++;
}
搜索更多相关主题的帖子: 完美 include return 最大值 
2012-11-16 13:01
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:14 
栈的功能就是  后进先出      

你想把它 整成什么东西?
2012-11-16 15:45
weiziyi0530
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-16
收藏
得分:0 
回复 2楼 寒风中的细雨
我这个多输几个元素进去就是重复着输就有bug  我们老师说是逻辑错误,可是我怎么改都这样 所以希望能帮我改成最完美的算法
这个题是求一个栈 在任何时候都能知道栈的最大值  0为退出正数是进栈负数是退栈
2012-11-16 18:21
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
回复 3楼 weiziyi0530
在任何时候都能知道栈的最大值   -----   这句不理解...
2012-11-16 18:56
weiziyi0530
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-16
收藏
得分:0 
回复 4楼 寒风中的细雨
某个应用中,建立了一个栈S_num来存储若干数值(数值不重复)。栈开始时为空,随着应用的进行,不断有数值被压入栈,或者被弹出栈。 问题:如何在任何时候都知道栈S_num里面最大的数值是多少?分析你的办法时间复杂度。
这是我的题目
2012-11-16 21:47
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
回复 5楼 weiziyi0530
现在的关键是   这个栈  还需要保持 栈的特性   不能大乱入栈出栈的顺序?
2012-11-16 21:49
weiziyi0530
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-11-16
收藏
得分:0 
回复 6楼 寒风中的细雨
可以随时弹栈出栈 看你怎么操作就是说不停的执行压栈退栈操作都不会出现bug  可是我只要多输入几个元素就会有问题了
2012-11-16 21:51
快速回复:请教一下我这个栈始终都有逻辑问题求最完美的算法能在任何时候都知道栈 ...
数据加载中...
 
   



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

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