回 帖 发 新 帖 刷新版面

主题:[原创]栈的使用

#define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2 /*在math.h中定义OVERFLOW的值为3 */

 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int SElemType; /*指定操作对象为整型*/
 typedef int Boolean;
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
typedef struct{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
#include"zhan.h"

Status InitStack(SqStack &S)
{
    S.base=(SElemType * ) malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}
Status GetTop(SqStack S,SElemType &e)
{
  if(S.top==S.base)  return ERROR;
  e=*(S.top-1);
  return OK;
}
Status Push(SqStack &S,SElemType e)
{
    if(S.top-S.base>=S.stacksize)
    {
        S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base) exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;
    return OK;
}
Status Pop(SqStack &S,SElemType &e)
{
    if(S.top==S.base) return ERROR;
    e=*--S.top;
    return OK;
}


void main()
{
    SqStack S;
    int i,n=5,e,g;
    InitStack(S);
    for(i=1;i<=n;i++)
    {
        cin>>g;
        Push(S,g);
        GetTop(S,e);
        cout<<"栈内元素:"<<e<<endl;
    }
    for(i=5;i>0;i--)
    {
        Pop(S,e);
        cout<<"输出元素:"<<endl;
    }
}
 
这个程序编译时总是出现同样的错误:说missing "("before ":".我检查了几遍,都没有少。不知道问题出在哪?

回复列表 (共3个回复)

沙发

楼主,程序的错误点是你将教材书中的伪代码当成现成代码来看待了,就是下面两句犯了错误:
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;
注意到了没有,语句#define STACK_INIT_SIZE 100后面不需要添加分号的,下面那句也是,去掉这两句的分号就没有错误了。即:
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

板凳


哦,知道了。谢啦,原来是这样!谢谢你的提醒。

3 楼

我写的,用数组的概念,支持任意类型,但不检测overflow,让使用者自己负责,简单实用hehe. 并且用n(元素个数)取代了容易混淆的top. 
也不提供销毁函数,使用者直接用free(v.base)更简单而且透明.

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

typedef struct _vector {
    int n; // 个数
    int unitsize; // 数组单元大小
    void *base;
} Vector;

void createv (Vector *v, int size, int unitsize)
{
    v->n = 0;
    v->unitsize = unitsize;
    v->base = malloc(size*unitsize);
}

void pushv (Vector *v, void *data)
{
    void *top = v->base + v->n * v->unitsize;
    memcpy (top, data, v->unitsize);
    v->n++;
}

void popv (Vector *v, void *data)
{
    void *top;

    v->n--;
    top = v->base + v->n * v->unitsize;
    memcpy(data, top, v->unitsize);
}

int main()
{
    Vector v;
    int data = 1, i;

    createv (&v, 20, sizeof(int));
    printf ("base:%u\n", v.base);

    for (i = 0; i < 17; i++) {
        data = i;
        pushv (&v, &data);
    }
    printf ("n:%u\n", v.n);

    for (i = 0; i < 17; i++) {
        popv (&v, &data);
        printf ("top:%u\n", data);
    }
    printf ("n:%u\n", v.n);

    free (v.base);

    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册