#求助 数据结构顺序栈的表示与实现,写完发现没有错误但运行不了,感觉似乎缺点什么,第一次写数据结构。求大佬指点,感激不尽

/栈的存储与分配/
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;

#define STACK_INIT_SIZE 100 //存储空间初始分配量;
#define STACKINCREMENT 10 //存储空间分配增量;

typedef struct {
SElemType * base; //在栈构造之前和销毁之后,base 的值为NULL; /*base 为栈底,top 为栈顶 */
SElemType * top; //栈顶指针;
int stacksize; //当前已分配的存储空间,以元素为单位 ;
}SqStack;

Status InitStack ( SqStack &S);
//构造一个空栈;
Status DestroyStack ( SqStack &S);
//销毁栈 S,S 不再存在;
Status ClearStack ( SqStack &S);
//把 S置为空栈;
Status StackEmpty ( SqStack S);
//若栈 S为空栈,则返回 TRUE,否则返回 FALSE;
int StackLength ( SqStack S);
//返回 S的元素个数,即栈的长度;
Status GetTop ( SqStack S, SElemType &e);
//若栈不空,则用 e返回 S的栈顶元素,并返回 OK,否则返回 ERROR;
Status Push ( SqStack &S, SElemType e);
//插入元素 e为新的栈顶元素;
Status Pop ( SqStack &S, SElemType &e);
//若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK,否则返回 ERROR;
Status StackTraverse ( SqStack S, Status (*visit) ());
//从栈底到栈顶依次对栈中每个元素调用 visit(),一旦visit()失败,则操作失败;
Status visit( SqStack S);
//若存在,则遍历L返回OK,否则返回ERROR

Status InitStack ( SqStack &S){
//构造一个空栈;
S.base = ( SElemType *)malloc( STACK_INIT_SIZE * sizeof( SElemType));
/*S指SqStack里的内容 */
if (!S.base)exit(OVERFLOW); //存储分配失败;
S.top=S.base ;
S.stacksize =STACK_INIT_SIZE; /*判断栈是否已满 */
printf(“构造出一个空栈\n”);
return OK;
}
Status DestroyStack ( SqStack &S){
//销毁栈 S,S 不再存在;
free( S.base);
/释放栈空间,这里假设s.base是个指针而不是数组,如果s结构也是动态申请的,也需要执行free(s)/
S.base=NULL;
printf(“栈已销毁\n”);
return OK;
}

Status ClearStack ( SqStack &S){
//把 S置为空栈;
S.top=S.base ;
S.stacksize =0;
printf(“栈已清空\n”);
return OK;
}

Status StackEmpty ( SqStack S){
//若栈 S为空栈,则返回 TRUE,否则返回 FALSE;
if(S.stacksize==0) //?
{
printf(“顺序栈已清空\n”);
return TRUE;
}
else
return FALSE;
}

int StackLength ( SqStack S){
//返回 S的元素个数,即栈的长度;

 return OK;

}

Status GetTop ( SqStack S, SElemType &e){
//若栈不空,则用 e返回 S的栈顶元素,并返回 OK,否则返回 ERROR;
if( S.base==S.top)
{
printf(“栈为空\n”);
return ERROR;
}
e= *( S.top-1);
return OK; // ?
}

Status Push ( SqStack &S, SElemType e){
//插入元素 e为新的栈顶元素;
if ( S.top-S.base>= S.stacksize)
{
S.base= ( SElemType*)realloc(S.base,( S.stacksize +STACKINCREMENT)* sizeof ( SElemType));
//栈满,追加存储空间;
printf(“栈满,追加存储空间\n”);
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){
//若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK,否则返回 ERROR;
if ( S.top==S.base )
{
printf(“栈为空!\n”);
return ERROR;
}
e= * --S.top ;
return OK;
}

/*Status visit( SqStack S)//若存在,则遍历L返回OK,否则返回ERROR
{
if ( S.top){
printf(“the data of the list is:”);
S.top= S.top ->next;
for (; S.top != S.base;){
printf(“S.top->data”,S.top->data) ;
S.top = S.top->next;
}
printf(" S.base->data", S.base->data) ;//最后输出栈底的数据元素
return OK;
}
else return ERROR;
}

Status StackTraverse ( SqStack S, Status (visit) ()){
//从栈底到栈顶依次对栈中每个元素调用 visit(),一旦visit()失败,则操作失败;
if ( visit( S)){
return OK;
}
else
{
return ERROR;
}
}
/
Status visit(int e){
printf("%d\n",e);
printf(" ");
return OK;
}
Status StackTraverse( SqStack S,Status (visit) (int)){ //从栈底开始访问栈元素
/
while(S.top>S.base)
visit((S.base)++);
return OK;
}
/

if (S.top == S.base) 
{	
    printf("栈为空!\n");	
    exit(0);	
}	
 while (!(S.top == S.base))
  {	
	visit(*(--S.top));	
	}
return OK;

}

int main(){
int e;
int i,j,a;
SqStack S;

InitStack ( S);

/* while(e–) //不能用for循环;
{
scanf("%d",&i);
Push(S,i);
}*/

printf("该顺序栈中元素个数为:\n", StackLength( S));

printf("栈顶元素为:\n",GetTop( S,e));

/* while(S.top!=S.base)
{
//j=GetTop(S);//返回栈顶元素的值
//printf("%d\n",j);
j=Pop(S,a);
printf("%d",j);//删除栈顶元素
}//这两个函数也可以一块使用;
*/
StackTraverse( S, visit) ;

ClearStack( S );
StackEmpty (  S );

DestroyStack( S );

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值