第一次了解c++面向对象的性质,让我们来通过自己写一个栈的数据类型的编写吧
首先是栈的数据类型用c语言来写:
//c语言写的栈
#include <stdio.h>
#define STACK_SIZE 128
typedef struct stack
{
int top;
int buffer[STACK_SIZE];
};
int main()
{
stack st;
st.top = -1;//对我们的栈的进行初始化。
//入栈
int a = 0;
printf("请输入你想要放入栈中的数据(数字):");
scanf("%d",&a);
if (st.top == STACK_SIZE)
{
printf("该栈已满");
return 0;
}
st.top++;
st.buffer[st.top] = a;
//退栈
if (st.top == -1)
{
printf("该栈已空");
return 0;
}
a = st.buffer[st.top];
st.top--;
printf("%d", a);
return 0;
}
当然我们知道,上面这些代码是没有意义的,我们在写一个栈的时候肯定不会这么写,将所有的内容都写进main主函数的行为实在是太初级的,如果你稍微对c语言熟练一些,你肯定会写一部分子程序来帮助我们完成这个功能。
进阶版本:
//c语言写的栈
#include <stdio.h>
#define STACK_SIZE 128
typedef struct stack
{
int top;
int buffer[STACK_SIZE];
};
void pushstack(stack&st)//入栈
{
int a = 0;
printf("请输入你想要放入栈中的数据(数字):");
scanf("%d", &a);
if (st.top == STACK_SIZE - 1)
{
printf("该栈已满\n");
return ;
}
st.top++;
st.buffer[st.top] = a;
}
void pullstack(stack& st)//出栈
{
int a = 0;
if (st.top == -1)
{
printf("该栈已空\n");
return ;
}
a = st.buffer[st.top];
st.top--;
printf("%d\n", a);
}
void init(stack& st)//对我们的栈的进行初始化。
{
st.top = -1;
}
void func(stack& st)
{
printf("1.pushstack 2.pullstack 3.exit\n");
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:pushstack(st);func(st);break;
case 2:pullstack(st);func(st);break;
case 3:return;break;
}
}
int main()
{
stack st;
init(st);
func(st);
return 0;
}
好了,这个版本帮助我们能持续的使用进退栈的功能,已经足够优秀了。
但是这是如果出现了一些熊孩子,它在看你的文件时,利用你的文件中的函数对你的栈进行了修改,你的栈这时候就会出现问题。(这句话看起来有点怪怪的,意思就是我在这个文件中的其他部分可以使用其他函数对这个栈进行修改)
这也是我们c++的好处了,当使用c++的面向对象时,我们定义一个关于栈的类,对于这个栈的数据类型,我们只能使用栈的内部函数对它进行修改。
//c++写的栈
#include <iostream>
using namespace std;
#define STACK_SIZE 128
class stack
{
private:
int top;
int buffer[STACK_SIZE];
public:
stack() :top(-1) {};
void pushstack();
void pullstack();
void func();
};
void stack::pushstack()
{
int a = 0;
cout << "请输入你想要放入栈中的数据(数字):";
cin >> a;
if (top == STACK_SIZE - 1)
{
cout<<"该栈已满\n";
return;
}
top++;
buffer[top] = a;
}
void stack::pullstack()
{
int a = 0;
if (top == -1)
{
cout << "该栈已空\n";
return;
}
a = buffer[top];
top--;
cout << a<<endl;
}
void stack::func()
{
cout<<"1.pushstack 2.pullstack 3.exit\n";
int a = 0;
cin >> a;
switch (a)
{
case 1:pushstack();func();break;
case 2:pullstack();func();break;
case 3:return;break;
}
}
int main()
{
stack a;
a.func();
return 0;
}
上面就是用c++的面向对象的特性来编辑的代码。
当然以上的三种我们其实都是在使用数组来当做我们的栈,在C语言中我们还学习了链表的方式来进行我们的数据储存,
//c++写的栈
#include <iostream>
using namespace std;
#define STACK_SIZE 128
class stack
{
private:
struct Node
{
int content;
Node* next;
}*top;
public:
stack() :top(NULL) {};
void pushstack();
void pullstack();
void func();
};
void stack::pushstack()
{
int a = 0;
Node* p = new Node;
cout << "请输入你想要放入栈中的数据(数字):";
cin >> a;
if (p==NULL)
{
cout<<"该栈已满\n";
return;
}
p->content = a;
p->next = top;
top = p;
}
void stack::pullstack()
{
int a = 0;
if (top == NULL)
{
cout << "该栈已空\n";
return;
}
Node* p = top;//这里刚开始我也没看明白,实际上就是一个结构体的copy
top = top->next;
a = p->content;
delete p;
cout << a<<endl;
}
void stack::func()
{
cout<<"1.pushstack 2.pullstack 3.exit\n";
int a = 0;
cin >> a;
switch (a)
{
case 1:pushstack();func();break;
case 2:pullstack();func();break;
case 3:return;break;
}
}
int main()
{
stack a;
a.func();
return 0;
}
以上大概就是我第一次上高级程序设计的收获了。
也是刚开始接触c++,可能说的有不正确的地方,希望可以指正。