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

求助。。。栈的操作。。

shenlanlan 发布于 2011-11-07 23:34, 1060 次点击
#include<stdio.h>
#include<stdlib.h>

#define MAX 5

typedef struct{
    int *top;
    int *base;
    int size;
}sqstack;

void initstack(sqstack &s){
//    sqnode *p;
    s.base=(int*)malloc(sizeof(sqstack));
    if(s.base!=NULL)
        s.top=s.base;
        
   
}

int push(sqstack s,int e){//元素E入栈S
        *s.top=e;
        s.top++;
        ++s.size;
                return 0;
}

int pop(sqstack s){//元素出栈
    int e;
        s.top--;
    e=*s.top;
        return 0;
}

int gettop(sqstack s,int e){//用E返回栈的栈顶元素
    while(s.size){
        s.top--;
        e=*s.top;
    }
    return e;
}
int main(){
    sqstack s;
    int i,e;
    s.size=0;
    initstack(s);
    printf("现在是元素入栈:");
    for(i=1;i<=MAX;i++){
        scanf("%d",&e);
        push(s,e);
    }
   
    printf("它的栈顶元素是%d.\n",gettop(s,e));
    printf("现在是元素出栈:");
    for(i=1;i<=MAX;i++){
        e=pop(s);
        printf("%3d",e);//问题在这里,在出栈输出后,怎么都是‘0’呀?
    }
    printf("\n");
    return 0;        
}        
   
//希望大家帮我看看,谢谢喽!
11 回复
#2
绿茶盖儿2011-11-08 00:23
你自己看一下你的pop函数,每次返回的都是0值,e当然就都等于0了
#3
shenlanlan2011-11-08 22:37
回复 2楼 绿茶盖儿
改为return e后,出栈输出变成了随机数,问题在哪呢?我刚开始学,请详细说一下,谢谢了。
#4
leizisdu2011-11-09 10:55
回复 楼主 shenlanlan
楼主,我在网上看到一位外国朋友写的关于栈的程序设计,认为您可以做如下改进:
    1、栈的存储结构中的top元素完全可以用int型,配合base元素,int型top完全可以达到遍历全栈的目的;
    2、你的pop()函数就能返回栈顶元素,为什么还要加个gettop()函数?
    3、您的push()和pop()函数的形参应该用指针或者应用类型吧!
    4、为了能更好地判断出栈或者入栈操作是否成功,可以让push()和pop()函数分别返回bool类型,至于对出栈元素的返回,可以让pop()函数再增加一个指针或引用类型形参;

[ 本帖最后由 leizisdu 于 2011-11-9 17:06 编辑 ]
#5
leizisdu2011-11-09 10:55
回复 楼主 shenlanlan
具体代码如下:“
程序代码:

#include <stdio.h>
#include <stdlib.h>   // malloc()

#define  MAX 5

typedef struct{
    int top;
    int *base;
    int size;
}sq_stack;

void init_stack(sq_stack &s){
   s.size = MAX;
   s.base = (int*)malloc(sizeof(int) * s.size);
   if (s.base == NULL)
   {
      printf("内存空间不足!\n");
      exit(1);
   }
   s.top = -1; // top==-1表示栈空
}

bool push(sq_stack &s,int e){    //元素E入栈S
   if (!(s.top == (s.size - 1))) // 如果s.top==s.size-1, 表示栈已满
   {
      s.base[++(s.top)] = e;
      return true;
   }
   return false;
}

bool pop(sq_stack &s, int &e){  //元素出栈
   if (!(s.top == -1))        // 要想能出栈, 首先栈不能为空.
   {
      e = s.base[(s.top)--];
      return true;
   }
   return false;
}

int main(){
   sq_stack s;
   int i,e;
   init_stack(s);    // 其实, 栈的元素个数最好也可以人为指定.
   printf("现在是元素入栈(栈中最多只能存5个元素): ");
   for(i=1; i<=MAX; ++i){
      scanf("%d", &e);
      push(s, e);
   }
   
   printf("现在是元素出栈: ");
   for(i=1;i<=MAX;i++){
      //e=pop(s);
      pop(s, e);
      printf("%3d",e);
   }
   printf("\n");
   return 0;        
}        

”。

[ 本帖最后由 leizisdu 于 2011-11-10 08:53 编辑 ]
#6
leizisdu2011-11-09 10:58
回复 楼主 shenlanlan
另外,楼主,有一点请注意,在输入元素的时候,要用空格分隔,而不能用“,”分隔。不知道这是为什么?对scanf()函数我还是不怎么会用,
#7
绿茶盖儿2011-11-09 13:35
回复 3楼 shenlanlan
程序代码:

#include<stdio.h>
#include<stdlib.h>

#define MAX 5

typedef struct{
    int *top;
    int *base;
    int size;
}sqstack;

void initstack(sqstack &s){
//    sqnode *p;
    s.base=(int*)malloc((MAX+1)*sizeof(sqstack));

 //   if(s.base!=NULL)      
        s.top=s.base;
        
   
}

int push(sqstack &s,int e){//元素E入栈S    改动:加引用符&
        *s.top=e;
        s.top++;
        ++s.size;
                return 0;
}

int pop(sqstack &s){//元素出栈           改动:加引用符&
    int e;
    s.top--;
    e=*s.top;
    --s.size;          //改动:出栈后s.size要减1
        return e;
}

int gettop(sqstack s,int e){//用E返回栈的栈顶元素
    if(s.size){       //改动:把while改为if,不然这里只要s.size>0,就成了一个死循环了  
        s.top--;
        e=*s.top;
    }
    return e;
}
int main(){
    sqstack s;
    int i,e;
    s.size=0;
    initstack(s);
    printf("现在是元素入栈:");
    for(i=1;i<=MAX;i++){
        scanf("%d",&e);
        push(s,e);
    }
   
    printf("它的栈顶元素是%d.\n",gettop(s,e));
    printf("现在是元素出栈:");
   for(i=1;i<=MAX;i++){
        e=pop(s);      
        printf("%3d",e);//问题在这里,在出栈输出后,怎么都是‘0’呀?
  }
    printf("\n");
    return 0;        
}        
   


[ 本帖最后由 绿茶盖儿 于 2011-11-9 13:38 编辑 ]
#8
shenlanlan2011-11-11 21:06
回复 4楼 leizisdu
谢谢你了。
#9
leizisdu2011-11-12 09:25
回复 8楼 shenlanlan
不用谢,我也正在学,
#10
Sv少2011-11-12 20:28
void initstack(sqstack &s)
{
     s.base=(int*)malloc((MAX+1)*sizeof(sqstack));  /*这样申请动态空间是不是有点浪费空间了: s.base=(int*)malloc((MAX+1)*sizeof(int));这样是不是会更好些*/
     if(s.base!=NULL)      
        s.top=s.base;   
}
新手上阵 若有错误 多多包涵!
#11
Sv少2011-11-12 20:53
#include<stdio.h>
#include<stdlib.h>

#define MAX 5

typedef struct{
    int *top;
    int *base;
    int size;
}sqstack;

void initstack(sqstack &s){
//    sqnode *p;
    s.base=(int*)malloc(sizeof(int));
    if(s.base!=NULL)
        s.top=s.base;
        
   
}

int push(sqstack &s,int e){//元素E入栈S
        *s.top=e;
        s.top++;
        ++s.size;
         return 0;
}

int pop(sqstack &s){//元素出栈
    int e;
    e=*--s.top;
    printf("%7d",e);
    return e;
}

int gettop(sqstack s,int e){//用E返回栈的栈顶元素
    if(s.size>0){

        e=*(s.top-1);
    }
    return e;
}
int main(){
    sqstack s;
    int i,e;
    s.size=0;
    initstack(s);
    printf("现在是元素入栈:");
    for(i=1;i<=MAX;i++){
        scanf("%d",&e);
        push(s,e);
    }
   
    printf("它的栈顶元素是%d.\n",gettop(s,e));
    printf("现在是元素出栈:");
    for(i=1;i<=MAX;i++){
        e=pop(s);
        printf("%3d",e);//问题在这里,在出栈输出后,怎么都是‘0’呀?
    }
    printf("\n");
    return 0;        
}        
可以通过引用来改变主函数的栈的内容
#12
心灵百合2011-11-15 17:34
支持
1