栈(C语言实现)基本操作
2018-02-08 00:44
197 查看
1.1 栈的定义:
栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。
1.2 栈的存储实现和运算实现
栈是运算受限的线性表,线性表的存储结构对栈也是适用的,只是操作不同而已。
利用顺序存储方式实现的栈称为顺序栈。与线性表类似,栈的动态分配顺序存储结构如下:
#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREMENT 10 //存储空间的分配增量
typedef struct{
SElemType *base; //在栈构造之前和销毁之后,base 的值为 NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间
}SqStack;
需要注意,在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top始终在栈顶元素的下一个位置。
下面是顺序栈上常用的基本操作的实现。
(1)入栈:若栈不满,则将 e 插入栈顶。
int Push (SqStack &S, SElemType e) {
if (S.top-S.base>=S.stacksize)
{……} //栈满,追加存储空间
*S.top++ = e; //top 始终在栈顶元素的下一个位置
return OK;
}
(2)出栈:若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK,否则返回
ERROR。
int Pop (SqStack &S, SElemType &e) {
if (S.top==S.base) return ERROR;
e = *--S.top;
return OK;
}
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空常作为一种控制转移的条件。
#include<stdio.h>
栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。
1.2 栈的存储实现和运算实现
栈是运算受限的线性表,线性表的存储结构对栈也是适用的,只是操作不同而已。
利用顺序存储方式实现的栈称为顺序栈。与线性表类似,栈的动态分配顺序存储结构如下:
#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREMENT 10 //存储空间的分配增量
typedef struct{
SElemType *base; //在栈构造之前和销毁之后,base 的值为 NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间
}SqStack;
需要注意,在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top始终在栈顶元素的下一个位置。
下面是顺序栈上常用的基本操作的实现。
(1)入栈:若栈不满,则将 e 插入栈顶。
int Push (SqStack &S, SElemType e) {
if (S.top-S.base>=S.stacksize)
{……} //栈满,追加存储空间
*S.top++ = e; //top 始终在栈顶元素的下一个位置
return OK;
}
(2)出栈:若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK,否则返回
ERROR。
int Pop (SqStack &S, SElemType &e) {
if (S.top==S.base) return ERROR;
e = *--S.top;
return OK;
}
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空常作为一种控制转移的条件。
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define true 1 #define false 0 #define error 0 #define ok 1 //#define SElemType int typedef int SElemType; //顺序栈 typedef struct { SElemType *base; SElemType *top; int stacksize; //当前已分配的存储空间 }SqStack; //初始化栈 int InitStack(SqStack &S) { S.base = (SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE); if (!S.base) return error; S.stacksize = STACK_INIT_SIZE; S.top = S.base; return ok; } //销毁栈 int DestroyStack(SqStack &S) { S.top = NULL; S.stacksize = 0; free(S.base); return ok; } //清空栈 int ClearStack(SqStack &S) { S.top = S.base; return ok; } //判断栈是否为空 int StackEmpty(SqStack S) { if (S.top == S.base) return 1; else return 0; } //栈的长度 int StackLength 4000 (SqStack S) { return (S.top - S.base); } //栈顶元素 int GetTop(SqStack S) { if (S.top == S.base) return false; SElemType e = *(S.top - 1); return e; } //入栈 //在栈的动态分配顺序存储结构中,base 始终指向栈底元素,非空栈中的 top //始终在栈顶元素的下一个位置。 int push(SqStack &S, SElemType &e) { if (S.top - S.base >= STACK_INIT_SIZE) { //栈满 S.base = (SElemType*)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACKINCREMENT)); if (!S.base) return false; S.stacksize = S.stacksize + STACKINCREMENT; S.top = S.base + STACK_INIT_SIZE; } //重新定位栈顶元素 *S.top = e; S.top++; //*S.top++=e; return 1; } //出栈 int pop(SqStack &S, SElemType &e) { if (S.base == S.top) return error; S.top--; e = *S.top; //e=*--S.top; return e; } int printS(SqStack S) { if (S.base == NULL) return error; if (S.top == S.base) printf("栈中没有元素\n"); SElemType *p = S.top; while (p>S.base) { p--; printf("%d\n", *p); } }
相关文章推荐
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 单链表的基本操作(C语言实现)
- C语言实现二叉树的基本操作
- C语言实现链表的基本操作
- (一个代码学会c语言操作数据库)linux上通过c语言操作数据库实现基本的学生信息管理系统(增、删、查、改‘显示)
- C语言实现栈的基本操作
- C语言实现双向非循环链表(带头结点尾结点)的基本操作
- 算法与数据结构-二叉树的基本操作C语言实现
- C语言实现单链表的基本操作及其部分面试题
- 顺序栈——9种基本操作和实现(C语言)
- 单链表的基本操作C语言实现
- C语言来实现链表的相加基本操作 桂林电子科技大学 大二实验
- C语言实现顺序表的基本操作
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
- 算法与数据结构-栈的基本操作C语言实现
- C语言提高-第26/27讲: 实现线性表基本操作的函数/编写查找和排序函数
- 第7周 C语言及程序设计提高例程-26 实现线性表基本操作的函数
- c语言实现图的基本操作--邻接矩阵存储
- C语言实现顺序表的基本操作
- C语言实现双链表基本操作(创建、查找、插入、删除)