c语言代码实现
C语言实现 栈(链栈)的相关操作,实现了如下方法:
- 初始化栈
InitLinkStack(LinkStack &stack); - 销毁栈
DestroyLinkStack(LinkStack &stack); - 判断栈是否为空
LinkStackEmpty(LinkStack stack); - 获取栈的长度
LinkStackLength(LinkStack stack); - 获取栈顶元素
GetTop(LinkStack stack, ElemType &e); - 清空栈
ClearLinkStack(LinkStack &stack); - 入栈操作
Push(LinkStack &stack, ElemType e); - 出栈操作
Pop(LinkStack &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 LinkStackNode{
//数据域
ElemType data;
//指针域,栈顶方向指向栈底
struct LinkStackNode *next;
}LinkStackNode, *LinkStack;
//----------------------------------------------
//初始化栈
Status InitLinkStack(LinkStack &stack);
//销毁栈
Status DestroyLinkStack(LinkStack &stack);
//判断栈是否为空
Status LinkStackEmpty(LinkStack stack);
//获取栈的长度
int LinkStackLength(LinkStack stack);
//获取栈顶元素
void GetTop(LinkStack stack, ElemType &e);
//清空栈
Status ClearLinkStack(LinkStack &stack);
//入栈操作
Status Push(LinkStack &stack, ElemType e);
//出栈操作
Status Pop(LinkStack &stack, ElemType &e);
//----------------------------------------------
int main(){
//初始化栈
LinkStack *stack = new LinkStack;
InitLinkStack(*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 = LinkStackEmpty(*stack);
printf("栈是否为空:%d\n", isEmpty);//0
//出栈
Pop(*stack, e1);
printf("出栈元素:%c\n", e1);//f
//栈的长度
int length = LinkStackLength(*stack);
printf("栈的长度:%d\n", length);//5
//获取栈顶元素
GetTop(*stack, e1);
printf("栈顶元素:%c\n", e1);//e
//清空栈
ClearLinkStack(*stack);
//出栈
Pop(*stack, e1);//出栈失败!栈里没有元素了
//销毁栈
DestroyLinkStack(*stack);
}
/**
* 初始化栈,构造一个空栈
* @param stack 栈
* @return
*/
Status InitLinkStack(LinkStack &stack){
//stack指向NULL即为空栈,stack表示栈顶,空栈时stack也是栈底
stack = NULL;
return OK;
}
/**
* 判断栈是否为空,是空栈返回TRUE
* @param stack 栈
* @return
*/
Status LinkStackEmpty(LinkStack stack){
//栈顶为空即为空栈(空栈时栈顶即为栈底)
return stack? FALSE: TRUE;
}
/**
* 获取栈的长度
* @param stack 栈
* @return
*/
int LinkStackLength(LinkStack stack){
int size = 0;
LinkStackNode *p = stack;
while(p){
p = p->next;
size++;
}
return size;
}
/**
* 清空栈
* @param stack
*/
Status ClearLinkStack(LinkStack &stack){
//将stack指向栈底
for(; stack && stack->next; (stack = stack->next));
//将栈底设置为空
stack = NULL;
return OK;
}
/**
* 销毁栈
* @param stack
*/
Status DestroyLinkStack(LinkStack &stack){
//将stack指向栈底
for(; stack && stack->next; (stack = stack->next));
//将栈底销毁
delete stack;
return OK;
}
/**
* 获取栈顶元素
* @param stack
* @param e :用来接收栈顶元素
*/
void GetTop(LinkStack stack, ElemType &e){
//将stack栈顶指向的结点的数据域赋值给e
stack? e = stack->data: e = NULL;
}
/**
* 入栈操作
* @param stack 栈
* @param e 要入栈的元素
*/
Status Push(LinkStack &stack, ElemType e){
//新建结点
LinkStackNode *newStackNode = new LinkStackNode;
newStackNode->data = e;
if(!stack){
//当前为空栈状态,有第一个元素入栈,将这个结点的next指针域设置为空
newStackNode->next = NULL;
} else{
//不是第一个元素入栈,将这个结点的next指针域指向当前stack
newStackNode->next = stack;
}
//栈顶上移,栈顶指向新插入的结点
stack = newStackNode;
}
/**
* 出栈操作
* @param stack 栈
* @param e 用来接收出栈的元素
*/
Status Pop(LinkStack &stack, ElemType &e){
//不是空栈才能出栈
if(stack){
//将栈顶指向的结点的数据域赋值给e
e = stack->data;
//栈顶下移
stack = stack->next;
return OK;
}
printf("出栈失败!栈里没有元素了\n");
return ERROR;
}