一个实例了解诸多语法特性:
由一个简单的十进制转二进制的小实例开始。
可以写成递归的顺序c++模板类,比较一下迭代与递归的对应关系。
可以同时实现控制台输出与文件输出。
可以使用标准库提供的栈。
也可以使用结构体+全局函数自定义一个顺序栈结构体及操作。
也可以使用类自(数据成员+成员函数)定义一个顺序栈类。
也可以将顺序栈类升级为模板类。
这些可以大致了解C++的抽象过程(当然未包括其精髓所在:继承与多态c++模板类,需要更深入,这里只是入门一下C++的语法)。
细节见代码注释:
#include
#include
using namespace std;
void d2bSeqenceStack(int n)// decimal to binary
{
int data[64] = {0};
int top = 0;
do
data[top++] = n%2;
while(n/=2);
for(int i=top-1;i>=0;i--)
printf("%d",data[i]);
}
void d2bIncursion(int n)
{
if(n>0)
{
d2bIncursion(n/2);
FILE *fp;
fp = fopen("C:\test.txt","a+");
if(!fp)
{
printf("打开文件出了问题!");
exit(-1);
}
fputc(n%2+'0',fp);
printf("%d",n%2);
fclose(fp);
}
}
void d2bOutput2File()
{
for(int i=0;i=MAXSIZE;
}
bool isFull(Mss& mss){
return mss.idx>=MAXSIZE;
}
bool push(Mss& mss,int val){
if(!isFull(mss))
{
mss.data[mss.idx++] = val;
return true;
}
else
return false;
}
bool CMss::push(int val){
if(!isFull())
{
data[idx++] = val;
return true;
}
else
return false;
}
bool empty(Mss& mss){
return mss.idx<=0;
}
bool CMss::empty(){
return idx<=0;
}
bool pop(Mss& mss)
{
if(empty(mss))
{
return false;
}
else{
mss.idx--;
return true;
}
}
bool CMss::pop()
{
if(empty())
{
return false;
}
else{
idx--;
return true;
}
}
int top(Mss& mss){
return mss.data[mss.idx];
}
int CMss::top(){
return data[idx];
}
void d2bByLibStack(int n)
{
stack st; // 标准库中的stack
do
st.push(n%2);
while(n/=2);
while(!st.empty())
{
printf("%d",st.top());
st.pop();
}
}
void d2bByMyStack(int n)
{
Mss st; // 自定义C的MyStack
do
push(st,n%2);
while((n/=2) && (!isFull(st)));
while(!empty(st))
{
pop(st);
printf("%d",top(st));
}
}
void d2bByMyStackClass(int n)
{
CMss st; // 自定义C++的MyStack(固定大小)
do
st.push(n%2);
while((n/=2) && (!st.isFull()));
while(!st.empty())
{
st.pop();
printf("%d",st.top());
}
}
class CMssD // 定义一个能动态增长空间的stack类
{
int *data;
int idx;
int capacity;
public:
CMssD(){
data = new int[MAXSIZE];
capacity = MAXSIZE;
idx = 0;
}
bool push(int val);
bool empty();
bool pop();
int top();
};
bool CMssD::push(int val){
if(capacity > idx)
{
data[idx++] = val;
return true;
}
else
{
int* tmpp = new int[capacity + MAXSIZE];
if(data != NULL)
{
for(int i=0;i<idx;i++)
tmpp[i] = data[i];
data = tmpp;
data[idx++] = val;
}
else
return false;
}
}
bool CMssD::empty(){
return idx<=0;
}
bool CMssD::pop()
{
if(empty())
{
return false;
}
else{
idx--;
return true;
}
}
int CMssD::top(){
return data[idx];
}
void d2bByMyStackClassD(int n)
{
CMssD st; // 自定义C++的MyStack(动态大小)
do
st.push(n%2);
while(n/=2);
while(!st.empty())
{
st.pop();
printf("%d",st.top());
}
}
template
class CMssDT
{
T *data;
int idx;
int capacity;
public:
CMssDT(){
data = new T[MAXSIZE];
capacity = MAXSIZE;
idx = 0;
}
bool push(T val);
bool empty();
bool pop();
int top();
};
template // 看一下类模板的简单写法,只要修修改改即可
bool CMssDT::push(T val){
if(capacity > idx)
{
data[idx++] = val;
return true;
}
else
{
int* tmpp = new T[capacity + MAXSIZE];
if(data != NULL)
{
for(int i=0;i<idx;i++)
tmpp[i] = data[i];
data = tmpp;
data[idx++] = val;
}
else
return false;
}
}
template
bool CMssDT::empty(){
return idx<=0;
}
template
bool CMssDT::pop()
{
if(empty())
{
return false;
}
else{
idx--;
return true;
}
}
template
int CMssDT::top(){
return data[idx];
}
void d2bByMyStackClassDT(int n)
{
CMssDT st; // 自定义C++的MyStack模板类(动态大小)
do
st.push(n%2);
while(n/=2);
while(!st.empty())
{
st.pop();
printf("%d",st.top());
}
}
int main()
{
d2bOutput2File();
int i = 1;
for(i=10;i<21;i++)
{
printf("%dt",i);
d2bByMyStackClassDT(i);
printf("n");
}
restart:
goto restart;
return 0;
}
/*
*/
运行效果:
输出到文件中的内容:
-End-
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。