您的位置:首页 > 理论基础 > 数据结构算法

数据结构——栈的构造、插入、删除、读取操作程序

2014-11-05 20:37 351 查看
#include<iostream>//c++头文件

#include<stdio.h>//c

#include<malloc.h>//要用malloc给他分配内存

#include<string.h>

#define chu 100//栈的初始化长度

#define zeng 10//当初始化长度用完之后,栈的长度就可以按照这个数值进行增加,这个用完之后,栈的长度可以接着再扩充

using namespace std;

typedef char SElemType;//数据类型定义为char了

typedef struct

{

SElemType *base;//栈底指针,始终指向栈底,位置不会改变,栈结构不存在(栈构造之前和销毁之后),base的值=null;

SElemType *top;//指向最顶,当base==top的时候,代表为空栈,栈里面没有东西,但是栈存在;

int stacksize;//栈当前已分配的空间,表示当前有多少元素

} SqStack;

//栈的构造,↑SqStack代表栈;

int Stack(SqStack &s)

{

s.base=(SElemType *)malloc(chu*sizeof(SElemType));//该类型所占的空间*该初始化长度

if(!s.base)//(s.base为null,!s.base代表内存分配失败)

exit(0);//结束程序

s.top=s.base;//否则将栈底指针和栈顶指针初始化到一块内存上,代表初始化成功,当前为空栈

s.stacksize=chu;//当前栈的长度

return 1;//int型要有返回值,return1代表当前函数正常结束;

}

int push1(SqStack &s,SElemType e)//这是插入函数,我插入的元素定义的为字符型,要改变当前栈或者元素时,才需要加&;

{

while(scanf("%c",&e)!=EOF&&e!='\n')//这个是我输入的字符个数是由我自己控制的,当输入回车时就自动结束了;

{

if(s.top-s.base>=s.stacksize)//当初始化长度已经用完就需要再增加扩充长度

{

s.base=(SElemType*)realloc(s.base,(s.stacksize+zeng)*sizeof(SElemType));

if(!s.base)

{

exit(0);

}

s.top=s.base+s.stacksize;

s.stacksize+=zeng;

}

*s.top++ =e;//把元素压入栈,因为刚开始栈底和栈顶是指向0号位置,所以当压入元素的时候,就需要将栈顶指针往上面移动

}

return 1;

}

int push2(SqStack &s,int e)//这个是我转化2进制时所用插入的函数,e是数字型

{

if(s.top-s.base>=s.stacksize)

{

s.base=(SElemType*)realloc(s.base,(s.stacksize+zeng)*sizeof(SElemType));

if(!s.base)

{

exit(0);

}

s.top=s.base+s.stacksize;

s.stacksize+=zeng;

}

*s.top++ =e;

return 1;

}

int gettop1(SqStack s,SElemType e,int n)//得到栈顶元素并输出,这个使用循环可以输出当前站内元素,这个栈里面存的是字符型

{

while(n--)

{

if(s.top==s.base)

return -1;

e=*(s.top-1);//因为非空栈顶元素的位置永远栈顶元素多一

s.top--;

cout<<"***"<<e<<endl;

}

return 1;

}

int gettop2(SqStack s,int e,int n)//得到栈顶元素并输出,这个使用循环可以输出当前站内元素,这个栈里面存的是int型

{

while(n--)

{

if(s.top==s.base)

return -1;

e=*(s.top-1);

s.top--;

cout<<e;

}

cout<<endl;

return 1;

}

int stacklength (SqStack s)//得到当前栈的元素长度

{

return s.top-s.base;//用栈顶位置和栈底位置相减便是长度

}

int pop(SqStack &s,SElemType &e,int n)//弹出元素并且销毁元素

{

while(n--)

{

if(s.top==s.base)

{

return -1;//判断是否为空栈,若为空栈则不能弹出

}

else

{

e=*(s.top-1);

s.top--;

cout<<e<<"%%%%%%%%%"<<endl;

}

}

return 1;

}

int main ()

{

SqStack s;

char e;

int n=10,x;

Stack(s);//创建栈

push1(s,e);//插入栈顶元素

int k=stacklength(s);//栈的长度

cout<<k<<endl;

gettop1(s,e,k);//得到栈顶元素,即为输出栈内元素

k=stacklength(s);

cout<<k<<endl;

pop(s,e,k);//得到栈顶元素,并删除该元素

k=stacklength(s);

cout<<k<<endl;

scanf("%d",&x);//将数字转化为2进制

while(x/2)

{

push2(s,x%2);

x=x/2;

}

push2(s,x);

k=stacklength(s);

cout<<k<<endl;

gettop2(s,e,k);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐