顺序栈的基本操作(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;
}
代码如有错误或有改进之处可留言或及时联系
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
