c语言代码实现
C语言实现 栈(顺序栈)的相关操作,实现了如下方法:
- 初始化栈
InitSqStack(SqStack &stack); - 销毁栈
DestroySqStack(SqStack &stack); - 判断栈是否为空
SqStackEmpty(SqStack stack); - 获取栈的长度
SqStackLength(SqStack stack); - 获取栈顶元素
GetTop(SqStack stack, ElemType &e); - 清空栈
ClearSqStack(SqStack &stack); - 入栈操作
Push(SqStack &stack, ElemType e); - 出栈操作
Pop(SqStack &stack, ElemType &e);
写的匆忙,如有错误,请大家指正一下。
#include <stdio.h>
#include <cstdlib>
//###一些常量
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//栈最大容量
#define MAXSIZE 5
//函数类型
typedef int Status;
//栈的元素类型
typedef char ElemType;
//定义顺序栈的结构体
typedef struct{
//栈底
ElemType *base;
//栈顶,指向最后一个元素的上一个位置
ElemType *top;
}SqStack;
//----------------------------------------------
//初始化栈
Status InitSqStack(SqStack &stack);
//销毁栈
Status DestroySqStack(SqStack &stack);
//判断栈是否为空
Status SqStackEmpty(SqStack stack);
//获取栈的长度
int SqStackLength(SqStack stack);
//获取栈顶元素
void GetTop(SqStack stack, ElemType &e);
//清空栈
Status ClearSqStack(SqStack &stack);
//入栈操作
Status Push(SqStack &stack, ElemType e);
//出栈操作
Status Pop(SqStack &stack, ElemType &e);
//----------------------------------------------
int main(){
//初始化栈
SqStack *stack = new SqStack;
InitSqStack(*stack);
//准备元素
ElemType e1 = 'a', e2 = 'b', e3 = 'c', e4 = 'd', e5 = 'e', e6 = 'f';
//入栈
Push(*stack, e1);
Push(*stack, e2);
Push(*stack, e3);
Push(*stack, e4);
Push(*stack, e5);
Push(*stack, e6);//入栈失败!栈满了
//判断栈是否为空
Status isEmpty = SqStackEmpty(*stack);
printf("栈是否为空:%d\n", isEmpty);//0
//出栈
Pop(*stack, e1);
printf("出栈元素:%c\n", e1);//e
//栈的长度
int length = SqStackLength(*stack);
printf("栈的长度:%d\n", length);//4
//获取栈顶元素
GetTop(*stack, e1);
printf("栈顶元素:%c\n", e1);//d
//清空栈
ClearSqStack(*stack);
//出栈
Pop(*stack, e1);//出栈失败!栈里没有元素了
//销毁栈
DestroySqStack(*stack);
}
/**
* 初始化栈,构造一个空栈
* @param stack 栈
* @return
*/
Status InitSqStack(SqStack &stack){
//申请一个数组空间,栈底和栈顶都指向数组第一个位置
//c++写法
stack.base = new ElemType[MAXSIZE];
//c语言写法
// stack.base = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
//判断是否分配内存成功,不成功就退出程序
if(!stack.base) exit(OVERFLOW);
//栈顶指向栈底的位置
stack.top = stack.base;
return OK;
}
/**
* 判断栈是否为空,是空栈返回TRUE
* @param stack 栈
* @return
*/
Status SqStackEmpty(SqStack stack){
//栈顶与栈底指向的位置相同即为空栈
return (stack.top==stack.base)? TRUE: FALSE;
}
/**
* 获取栈的长度
* @param stack 栈
* @return
*/
int SqStackLength(SqStack stack){
//栈顶与栈底的数组元素间差距即为栈的长度
return stack.top-stack.base;
}
/**
* 清空栈
* @param stack
*/
Status ClearSqStack(SqStack &stack){
//栈顶与栈底指向的位置一致,即为空表
stack.top = stack.base;
return OK;
}
/**
* 销毁栈
* @param stack
*/
Status DestroySqStack(SqStack &stack){
//栈已经被初始化
if(stack.base){
//销毁数组
delete stack.base;
//栈底和栈顶都为空
stack.base = stack.top = NULL;
}
return OK;
}
/**
* 获取栈顶元素
* @param stack
* @param e :用来接收栈顶元素
*/
void GetTop(SqStack stack, ElemType &e){
//将栈顶指向的前一个位置的元素赋值给e
e = *--stack.top;
}
/**
* 入栈操作
* @param stack 栈
* @param e 要入栈的元素
*/
Status Push(SqStack &stack, ElemType e){
//栈没有满才能进行入栈
if(stack.top-stack.base < MAXSIZE){
//元素入栈
*stack.top = e;
//栈顶上移
stack.top++;
return OK;
}
printf("入栈失败!栈满了\n");
return ERROR;
}
/**
* 出栈操作
* @param stack 栈
* @param e 用来接收出栈的元素
*/
Status Pop(SqStack &stack, ElemType &e){
//不是空栈才能出栈
if(stack.top > stack.base){
//栈顶下移
stack.top--;
//栈顶指向的位置出栈
e = *stack.top;
return OK;
}
printf("出栈失败!栈里没有元素了\n");
return ERROR;
}