链式栈的基本操作与实现
2015-05-17 12:17
411 查看
1:头文件:SqStack.h#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define STACK_SIZE 100
#define ADD_SIZE 10
typedef struct SqStack
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
bool Isempty(SqStack *s); //栈是否为空
bool IsFull(SqStack *s); //判栈是否已满
void InitStack(SqStack *s); //初始化栈
void PushStack(SqStack *s,ElemType x); //入栈
void PopStack(SqStack *s,ElemType *x); //出栈
void ShowStack(SqStack *s); //显示栈
void GetTop(SqStack *s,ElemType *x);//获取栈顶数据
void ClearStack(SqStack *s); //清理栈
void DestoryStack(SqStack *s); //摧毁栈
void Show(); //显示菜单
2:功能实现文件SqStack.cpp#include"SqStack.h"
void Show()
{
printf("***************************************\n");
printf("* [1]:入栈 [2]:出栈 *\n");
printf("* [3]:显示栈 [4]:获取栈顶数据*\n");
printf("* [5]:摧毁栈 [6]:清理栈 *\n");
printf("* [0]:结束程序 *\n");
printf("***************************************\n");
printf("请选择:");
}
void InitStack(SqStack *s)
{
s->base=(ElemType*)malloc(STACK_SIZE*sizeof(ElemType));
if(s->base==NULL)
{
printf("开辟空间失败\n");
return ;
}
s->top=s->base;
s->stacksize=STACK_SIZE;
}
bool IsFull(SqStack *s)
{
return s->top-s->base>=s->stacksize;
}
bool Isempty(SqStack *s)
{
return s->base==s->top;
}
void PushStack(SqStack *s,ElemType x)
{
if(IsFull(s))
{
s->base=(ElemType*)realloc(s->base,(s->stacksize+ADD_SIZE)*sizeof(ElemType));
if(s->base==NULL)
{
printf("增加空间失败\n");
return;
}
s->top=s->base+s->stacksize;
s->stacksize+=ADD_SIZE;
}
*s->top=x;
s->top++;
}
void PopStack(SqStack *s,ElemType *x)
{
if(Isempty(s))
{
printf("栈为空,不能出栈\n");
return;
}
s->top--;
*x=*s->top;
}
void GetTop(SqStack *s,ElemType *x)
{
if(Isempty(s))
{
printf("栈为空,不能获取栈数据\n");
return;
}
*x=*(s->top-1);
}
void ClearStack(SqStack *s)
{
s->base=s->top=NULL;
s->stacksize=0;
}
void DestoryStack(SqStack *s)
{
free(s->base);
ClearStack(s);
}
void ShowStack(SqStack *s)
{
ElemType *top=s->top;
while(top!=s->base)
{
top--;
printf("%d ",*top);
}
printf("\n");
}
3:主文件main.cpp#include"SqStack.h"
void main()
{
SqStack s;
ElemType x;
int pos=1;
InitStack(&s);
while(pos)
{
Show();
scanf("%d",&pos);
switch(pos)
{
case 1:
printf("输入数据,以-1结束:");
while(scanf("%d",&x),x!=-1)
{
PushStack(&s,x);
}
break;
case 2:
PopStack(&s,&x);
printf("出栈数据:%d\n",x);
break;
case 3:
ShowStack(&s);
break;
case 4:
GetTop(&s,&x);
printf("获取栈顶数据:%d\n",x);
break;
case 5:
DestoryStack(&s);
printf("栈已被摧毁\n");
break;
case 6:
ClearStack(&s);
printf("栈已被清理\n");
break;
default:
break;
case 0: return;
}
}
}
相关文章推荐
- 链式栈的基本操作实现c++
- (C语言版)栈和队列(一)——实现链式栈和链式队列的基本操作以及遇到的问题
- (C语言版)栈和队列(一)——实现链式栈和链式队列的基本操作以及遇到的问题
- C++实现链式栈,运用模板,界面友好,操作方便,运行流畅
- 顺序表类的实现和基本操作
- 实验4:栈和队列的基本操作实现及其应用之《排号叫号管理》
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
- 顺序表的基本操作实现
- 链表的可变数组的实现和一些基本操作
- C语言实现顺序表的基本操作
- 有序线性表的基本操作及实现
- 字符串基本处理操作:数组和指针实现 —— 不调用string函数库
- 数据结构:二叉树的基本操作(JAVA实现)
- 字符流的基本实现以及编码问题之读操作
- 【 数据结构】实现二叉树以及其基本操作
- 单链表的基本操作实现
- 【转载】MapReduce实现基本SQL操作的原理-join和group by,以及Dinstinct
- 使用C++数组实现二叉树的存储和基本操作
- 矩阵基本操作的实现(C# 源代码)
- 【编程练习】二叉查找树原理及基本操作编程(GNU C实现)