顺序栈的基本操作(c语言)

目录

 栈

栈的定义和特点:

栈的定义

顺序栈的初始化

入栈

出栈

取顺序栈的栈顶元素

遍历栈

返回栈中元素个数

销毁栈

 栈

栈的定义和特点:

栈是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表,又称为后进先出的线性表,称为LIFO结构

栈是仅在表尾进行插入、删除操作的线性表,表尾称为栈顶Top,表头称为栈底Base

a1称为栈底元素,an称为栈顶元素

插入元素到栈顶(即表尾)的操作,称为入栈、进栈、压栈

从栈顶(即表尾)删除最后一个元素的操作,称为出栈、弹栈

栈有顺序存储和链式存储两种存储方式

存储方式:同一般线性表的顺序存储结构完全相同

利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,栈底一般在低地址端

*另设top指针,指示栈顶元素在顺序栈中的位置

*另设base指针,指示栈底元素在顺序栈中的位置

为了方便操作,通常top指针指示真正的栈顶元素之上的下标地址

另外,用stacksize表示栈可使用的最大容量

空栈:base == top是栈空标志

栈满:top-base == stacksize

栈满时的处理方法:

分配更大空间,作为栈的存储空间,将原栈的内容移入新栈

使用数组作为顺序栈存储方式的特点:

简单、方便、但容易产生溢出

上溢:

栈已经满,又要压入元素

下溢:

栈已经空,又要弹出元素

代码实现:

注:许多课程里调用函数时函数的形参用&S,但这个&S好像在c语言编译器会报错,应该是c++可以实现(本人还没学c++,仅仅是猜测),所以c语言在函数调用时还是定义一个指针变量以实现各种操作

栈的定义

typedef struct {int* base;int *top;int Stacksize;
} Sqstack;

顺序栈的初始化

int InitStack(Sqstack* S)   //栈的初始化
{S->base = (int*)malloc(sizeof(int)*MAX);if (S->base == NULL) return error;S->top = S->base;S->Stacksize = MAX;printf("栈初始化成功\n");return ok;
}

入栈

int Push(Sqstack* S,int e)  //入栈
{if ((S->top - S->base) == S->Stacksize) {return error;}*(S->top) = e;(S->top)++;return ok;
}

出栈

int Pop(Sqstack* S,int *e)   //出栈
{if (S->top == S->base) {return error;}*e = *(--(S->top));return ok;
}

取顺序栈的栈顶元素

int Getpop(Sqstack S) //取栈顶元素
{printf("栈顶元素为%d\n", *(--S.top));return ok;
}

遍历栈

int printstack(Sqstack S, int h)
{int i;if (S.base == S.top) {return error;}for (i = 0; i < h; i++) {printf("栈中第%d个元素是%d\n", i + 1, *(S.base));(S.base)++;}return ok;
}

返回栈中元素个数

int getsize(Sqstack S)
{int i=0;if (S.top == S.base) {return error;}while (S.top != S.base) {i++;S.top--;}return i;
}

销毁栈

int destroystack(Sqstack* S)
{free(S->base);S->base = NULL;S->top = NULL;S->Stacksize = 0;printf("栈已销毁");return ok;
}

总的代码实现

#include
#include
#define ok 1
#define error 0
#define MAX 100
typedef struct {int* base;int* top;int Stacksize;
} Sqstack;
int InitStack(Sqstack* S);  //顺序栈的初始化
int Push(Sqstack* S, int e);  //入栈
int Pop(Sqstack* S,int *e);  //出栈
int Getpop(Sqstack S);  //取顺序栈的栈顶元素
int printstack(Sqstack S,int h);  //遍历栈
int getsize(Sqstack S);  //返回栈中元素个数
int destroystack(Sqstack* S);   //销毁栈
int main()
{int i, a, n, m, k, j;Sqstack L;InitStack(&L);printf("请输入栈的元素,当输入-1时代表输入完毕!  ");scanf_s("%d", &n);while (n != -1) {Push(&L, n);scanf_s("%d", &n);}i = getsize(L);printf("栈中有%d个元素\n", i);printstack(L, i);Getpop(L);Pop(&L,&a);printf("被删除的元素是%d\n",a);k = getsize(L);printf("删除栈顶元素后栈中共有%d个元素\n", k);printstack(L, k);Getpop(L);destroystack(&L);return 0;
}
int InitStack(Sqstack* S)   //栈的初始化
{S->base = (int*)malloc(sizeof(int) * MAX);if (S->base == NULL)return error;S->top = S->base;S->Stacksize = MAX;printf("栈初始化成功\n");return ok;
}
int Push(Sqstack* S, int e)  //入栈
{if ((S->top - S->base) == S->Stacksize) {return error;}*(S->top) = e;(S->top)++;return ok;
}
int Pop(Sqstack* S,int *e)   //出栈
{if (S->top == S->base) {return error;}*e = *(--(S->top));return ok;
}
int Getpop(Sqstack S) //取栈顶元素
{printf("栈顶元素为%d\n", *(--S.top));return ok;
}
int getsize(Sqstack S)
{int i = 0;if (S.top == S.base) {return error;}while (S.top != S.base) {i++;S.top--;}return i;
}
int printstack(Sqstack S, int h)
{int i;if (S.base == S.top) {return error;}for (i = 0; i < h; i++) {printf("栈中第%d个元素是%d\n", i + 1, *(S.base));(S.base)++;}return ok;
}
int destroystack(Sqstack* S)
{free(S->base);S->base = NULL;S->top = NULL;S->Stacksize = 0;printf("栈已销毁");return ok;
}

代码如有错误或有改进之处可留言或及时联系


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部