数据结构——栈的构造、插入、删除、读取操作程序
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;
}
#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;
}
相关文章推荐
- 数据结构--栈的构造、插入、删除、得到栈顶元素操作
- 笔试题:创建一个单链表,结点包含学生的学号,姓名,性别,年龄信息.写几个程序,实现按学生学号插入,查询,删除等操作.
- 【数据结构】采用数组的形式实现顺序表的建立、插入、删除等操作
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 栈操作,构造,插入,删除,转换
- 数据结构之单向链表操作1-(插入,删除,交换,反转,排序等操作)
- C# XML操作总结2 包括读取、插入、修改、删除
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 数据结构链表的操作集合(建立,遍历,插入,删除,排序,长度,空判断等)
- 数据结构顺序表的操作全集(创建,遍历,插入,删除,排序等等)
- 最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
- 经典计算机基础数据结构:红黑树(插入和删除操作的fixup理解)
- java 操作mongodb插入、读取、修改以及删除基础
- XML文件的操作(读取,插入,删除,修改)
- 单链表结点读取、插入、删除操作(基本操作)-C++
- Asp.Net 2.0 操作mysql 数据基类(读取,删除,插入,更新)
- 写给初学数据结构的同学之(循环双链表基本操作,创建,插入,删除,排序)
- 链表的相关操作查找插入删除(c++ 数据结构)
- Asp.Net 2.0 操作mysql 数据基类(读取,删除,插入,更新)
- 数据结构之循环链表操作3-(合并,拆分,插入,删除,建立等)