初学数据结构,麻烦大家把栈的基本操作用C语言描述一下,不要使用伪码,如果可能尽量加上一下注释,谢谢了

2025-03-05 01:21:17
推荐回答(3个)
回答1:

1、写个ADT,分两个文件写 stack.h,stack.c,我是对照严蔚敏的书写的,理解不了,可以对照着书看一下,代码Linux下行动通过
2、stack.h代码如下:
#ifndef _STACK_H
#define _STACK_H
#define stack_init_size 100 //存储空间初始大小
#define stack_increment 10 //存储空间分配增量
#define size sizeof(ElementType)
#define OK 1
#define ERROR 0
#define Empty 0
#define Nempty 1
typedef int ElementType;
typedef int status;
struct man{
ElementType *base;
ElementType *top;
int stacksize;
};
typedef struct man *stack;
typedef struct man strstack;
status Init_stack(stack s);
status Destroy_stack(stack s);
status Clear_stack(stack s);
status Is_empty(stack s);
int stacklength(stack s);
ElementType Get_top(stack s);
status push(stack s,ElementType e);
ElementType pop(stack s);
#endif

3、stack.c,代码如下:
#include
#include
#include"stack.h"

status Init_stack(stack s)
{
if((s->base=(ElementType *)malloc(stack_increment*size))==NULL) exit(0);
s->top=s->base;
s->stacksize=stack_init_size;
return OK;
}

status Destroy_stack(stack s)
{
free(s->base);
return OK;
}

status Clear_stack(stack s)
{
s->top=s->base;
return OK;
}

status Is_empty(stack s)
{
if(s->top==s->base) return Empty;
else return Nempty;
}

int stacklength(stack s)
{
return s->top-s->base;
}

ElementType Get_top(stack s)
{
if(Is_empty==Empty) {printf("No record\n");exit(0);}
else return *(s->top-1);
}

status push(stack s,ElementType e)
{
if(s->top==s->base+stack_init_size)
{
s->base=(ElementType *)realloc(s->base,(s->stacksize+stack_increment)*size);
if(s->base==NULL) exit(0);
s->top=s->base+s->stacksize;
s->stacksize+=stack_increment;
}
*s->top=e;
s->top++;
return OK;
}

ElementType pop(stack s)
{
if(Is_empty(s)==Empty) exit(0);
s->top--;
return *s->top;
}

4、用的时候在主函数里用include"stack.h",就可以调用所有stack.h里声明过的函数了

5、最后祝学业进步

回答2:

我可以发一分ppt 给你 里面有很详细的资料 你把邮箱给我,我给你

回答3:

(1) 初始化栈initStack(&s)
建立一个新的空栈s,实际上是将栈顶指针指向-1即可。对应算法如下:
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
(2) 销毁栈ClearStack(&s)
释放栈s占用的存储空间。对应算法如下:
void ClearStack(SqStack *&s)
{
free(s);
}
(3) 求栈的长度StackLength(s)
返回栈s中的元素个数,即栈指针加1的结果。对应算法如下:
int StackLength(SqStack *s)
{
return(s->top+1);
}
(4) 判断栈是否为空StackEmpty(s)
栈S为空的条件是s->top==-1。对应算法如下:
int StackEmpty(SqStack *s)
{
return(s->top==-1);
}
(5) 进栈Push(&s,e)
在栈不满的条件下,先将栈指针增1,然后在该位置上插入元素e。对应算法如下:
int Push(SqStack *&s,ElemType e)
{ if (s->top==MaxSize-1) return 0;
/*栈满的情况,即栈上溢出*/
s->top++;
s->data[s->top]=e;
return 1;
}
(6) 出栈Pop(&s,&e)
在栈不为空的条件下,先将栈顶元素赋给e,然后将栈指针减1。对应算法如下:
int Pop(SqStack *&s,ElemType &e)
{ if (s->top==-1) return 0;
/*栈为空的情况,即栈下溢出*/
e=s->data[s->top];
s->top--;
return 1;
}
(7) 取栈顶元素GetTop(s)
在栈不为空的条件下,将栈顶元素赋给e。对应算法如下:
int GetTop(SqStack *s,ElemType &e)
{
if (s->top==-1) return 0;
/*栈为空的情况,即栈下溢出*/
e=s->data[s->top];
return 1;
}
(8) 显示栈中元素DispStack(s)
从栈顶到栈底顺序显示栈中所有元素。对应算法如下:
void DispStack(SqStack *s)
{
int i;
for (i=s->top;i>=0;i--)
printf("%c ",s->data[i]);
printf("\n");
}