c++类编程的两个简单的例子

关于栈的数据结构:
类的头文件定义

//              stack.h  -- class definition for the stack
/******************************************************************/
#ifndef _STACK_
#define _STACK_

typedef unsigned long Item ;

class Stack
{
private:
            enum { MAX = 10 } ;
            Item items[MAX] ;
            int top ;
public:
            Stack();
            bool isempty() const ;
            bool isfull() const ;
            bool push( Item & item );
            bool pop(  Item & item );
};
#endif

关于具体实现的部分:

//        implement for the stack.h          //
/**********************************************
never let  the implement file has the
  cin  and cout  opeoration , just let
class func opers its own private data !
*********************************************/
#include "stack.h"

Stack::Stack(){
  top = 0 ;
}

bool Stack::isempty() const{
  return top == 0 ;
}

//  the const is needed to be added to the implement part 

bool Stack::isfull() const{
  return top == 10 ;
 }

bool Stack::push( Item & item){
if( top < MAX ){
    items[top++] = item ;
    return true ;
     }
   else
              return false ;
}

bool Stack::pop(Item & item){
if( top == 0 )
    return false ;
else{
    item = items[--top];
    return true ;
   }
}

测试部分:

#include "stack.h"
#include<iostream>

int main(){
int i ;

Item item = 8729 ;
Item get ;
Stack stack;

for ( i = 0 ; i < 15 ; i++ )
    stack.push(item);
for( i = 0 ; i < 15 ; i++ )
    {
        if(stack.pop(get))
        std::cout<<get<<std::endl;
    }

}

关于列表的实现,可以加入不同的数据类型的列表
声明的头文件:

#ifndef _list_
#define _list_
#include <stdio.h>
typedef struct elem{
    char type ;
        union
        {
                int   int_ ;
                short shrt_;
                char  char_;
                void * ptr ;
                double double_;
                float float_;
            }value;
        elem * next ;
        elem * fore ;
}Elem;

class List{
private:
                enum { INT , SHRT , CHR , PTR , DOU , FLT };
                unsigned int count ;
                elem * head ;
                elem * tail ;
public:
                List(){ count = 0 ; head = tail = NULL ;}
                bool push(Elem & item );
                bool pop (Elem & item );
                bool insert( int pos , Elem & item );
                bool purge ( int pos , Elem & item );
                bool getpos( int pos , Elem & item );
                bool isempty();
                void reverse();
                void show() const;
                ~List();
};
#endif

具体实现的文件:

#include "list.h"
#include<iostream>
#include<stdio.h>

void innershow(Elem * ptr)
{
        printf("  in function \n");
        std::cout<<"Type:";
        switch (ptr->type){
        case(0):  printf("int     value:%d\n",ptr->value);    break;
        case(1):  printf("short   value:%d\n",ptr->value);    break;
        case(2):  printf("char    value:%c\n",ptr->value);    break;
        case(3):  printf("pointer value:%p\n",ptr->value);    break;
        case(4):  printf("double  value:%f\n",ptr->value);    break;
        case(5):  printf("float   value:%f\n",ptr->value);    break;
        default:  printf("UNKNOWN value:%p\n",ptr->value);    break;
        }
}

bool List::push(Elem & item){
    Elem * entity = new Elem ;
    if( entity == NULL )
        return 0 ;
    entity->type = item.type ;
    entity->value = item.value ;
    count++;
    if(head == NULL ){
        entity->fore = NULL  ;
        head = tail = entity ;
    }
    else{
        entity->fore = tail ;
        tail->next = entity ;
        tail = entity ;
    }

entity->next = NULL;

return 1 ;
}

bool List::pop( Elem & item ){
    Elem * ptr ;
    if ( !count ) return 0;
    item.type = tail->type ;
    item.value= tail->value;
    if( head != tail ){
        ptr = tail->fore ;
        tail->fore->next = NULL ;
        delete tail ;
        tail = ptr ;
    }
    else{
        delete tail ;
        head = tail = NULL;
    }

    count--;

    return 1;
}

    bool List::insert( int pos , Elem & item ){
        Elem * ptr = NULL ;
        if( pos > count || pos < 0)
            return 0 ;
        if ( pos == count )
            push(item);
        else{
            ptr = head ;
            while(pos--) ptr = ptr->next ;

        Elem * entity = new Elem ;
        if( entity == NULL )
        return 0 ;
        entity->type = item.type ;
        entity->value = item.value ;

        if( ptr == head ){
            entity->next = head ;
            head->fore = entity ;
            entity->fore = NULL ;
            head = entity ;
        }
        else if ( ptr == tail ){
            entity->next = NULL ;
            entity->fore = tail ;
            tail->next = entity ;
            tail = entity ;
        }
        else{
            entity->next = ptr ;
            entity->fore = ptr->fore;
            ptr->fore->next = entity;
            ptr->fore = entity ;
        }
        count++;
    }

    return 1 ;
    }

bool List::purge ( int pos , Elem & item ){
Elem * ptr = NULL ;
if( pos >= count || pos < 0)
    return 0 ;
else{
    ptr = head ;
    while(pos--) ptr = ptr->next ;

    if( ptr == head ){
        ptr->next->fore = NULL ;
        ptr = ptr->next ;
        delete head ;
        head = ptr ;
    }
    else if( ptr == tail ){
        ptr->fore->next = NULL ;
        ptr = ptr->fore ;
        delete tail ;
        tail = ptr ;
    }
    else{
        ptr->fore->next = ptr->next ;
        ptr->next->fore = ptr->fore ;
        delete ptr;
    }
    count--;
}
return 1 ;
}

bool List::getpos( int pos , Elem & item ){
    int count ;
    Elem * ptr = NULL ;
    if( pos >= count || pos < 0)
        return 0 ;
    else{
        ptr = head ;
        while(pos--) ptr = ptr->next ;

        item.type = ptr->type ;
        item.value = ptr->value;
    }

    return 1 ;
}

bool List::isempty(){
    return count==0;
}

void List::reverse(){
    Elem * ptr = head ;
    Elem * swap ,* next ;
    while( ptr ){
        next = ptr->next ;
        swap = ptr->fore ;
        ptr->fore = ptr->next ;
        ptr->next = swap ;
        ptr = next ;
    }
    swap = head ;
    head = tail ;
    tail = swap ;
}

void List::show() const{
    Elem * ptr = head ;
    Elem * back ;
    std::cout<<"List items......\n";
    while(ptr){
        innershow(ptr);
        ptr = ptr->next ;
    }
    std::cout<<"***************************\n";
}

List::~List(){
    count = 0 ;
    Elem * ptr = head ;
    Elem * back ;
    while(ptr){
        back = ptr ;
        ptr = ptr->next ;
        delete back;
    }
}
具体的测试文件:
#include<iostream>
#include<stdio.h>
#include"list.h"
int main(){

    Elem elem = { 0 , 6526 };
    List list;
    list.push(elem);
    elem.type = 1 ;
    list.push(elem);
    list.show();
    elem.type = 2 ;
    list.push(elem);
    list.show();
    elem.type = 3 ;
    list.push(elem);
    list.show();
    elem.type = 4 ;
    list.push(elem);
    list.show();
    printf("*************\n");
    list.show();
    printf("*****swap******\n");
    list.reverse();
    list.show();

    return 0 ;
}

相信这两个例子都非常好的解释了类编程的思想

原文地址:http://blog.51cto.com/13824643/2132622

时间: 2024-10-29 19:10:19

c++类编程的两个简单的例子的相关文章

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

C#实现异步编程的两个简单机制

理解程序.进程.线程三者之间的区别:简而言之,一个程序至少有一个进程,一个进程至少有一个线程进程就是在内存中运行的程序(即运行着的程序):一个进程一般只有一个线程,一个进程可以包含多个线程(多线程编程): 使用异步编程的简单机制一:异步委托    委托类型的BeginInvoke和EndInvoke方法.        BeginInvoke方法:            参数组成:引用方法的参数列表+callback参数+state参数            返回值:IAsyncResult接口

caffe_实战之两个简单的例子(物体分类和人脸检测)

一.物体分类: 这里使用的是caffe官网中自带的例子,我这里主要是对代码的解释~ 首先导入一些必要的库: import caffe import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['figure.figsize'] = (10 , 10) #显示图像的最大范围,使用plt.rcParams['savefig.dpi']得到缺省的dpi值为100,则最大的图片范围为1000*10

Java 多线程编程两个简单的样例

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

两种简单实现菜单高亮显示的JS类(转载)

两种简单实现菜单高亮显示的JS类 近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web前端来说,是比较常用到的效果,正好此次又要用到,特地整理出我所写的两种高亮类. 其实思路很简单,第一种方法是通过遍历链接组的href值,通过indexOf判断href值是否被包含在浏览器当前url值中.此方法有一定局限,比如对于iframe内的菜单是不能这样判断的; 第二种方法适用范围更广一样,实现思路

利用JSP编程技术实现一个简单的购物车程序

实验二   JSP编程 一.实验目的1. 掌握JSP指令的使用方法:2. 掌握JSP动作的使用方法:3. 掌握JSP内置对象的使用方法:4. 掌握JavaBean的编程技术及使用方法:5. 掌握JSP中数据库编程方法: 二.实验要求 : 利用JSP编程技术实现一个简单的购物车程序,具体要求如下. (1)用JSP编写一个登录页面,登录信息中有用户名和密码,分别用两个按钮来提交和重置登录信息. (2)编写一个JSP程序来处理用户提交的登录信息,如果用户名为本小组成员的名字且密码为对应的学号时,采用J

使用类编程

在oop中使用类编程的一种模型就是客户/服务器模型.客户是使用类的程序.类声明(包括类方法)则构成了服务器,他是程序可以使用的资源.类中通过共有方式定义的类方法好比服务器的接口,服务器的责任是根据接口(类方法)准确地执行,服务器设计人员(定义类的程序员)只需在对应的接口下设计类实现的细节,而不需修改接口.客户则通过接口使用服务器的资源.这样程序员可以独立地修改服务器和客户,对服务器的修改就不会影响客户行为. 为了便于程序的修改和可读性,通常,一个程序分为三个文件,头文件和两个源文件.头文件用来声

描述性编程的两种写法

对象库编程(ORP)是一个非常强大的功能,如果对象名字改变了,只需要进入对象库修改对象,脚本即可批量更新. 描述性编程(DP)不需要维护庞大的对象库,而需要维护庞大的代码,但是在某些情况下(比如对象不能添加到对象库)它很有用. 下面通过一个例子来学习如何进行描述性编程: 首先,我们录制一段在百度首页输入“abcde”,然后点击“百度一下”的代码: Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd"

浅析C# 异步编程的两种方式

一.传统BeginInvoke方式. BeginInvoke方法用于启动c#异步调用.它返回IasyncResult,可用于监视调用进度.EndInvoke方法用于检索c#异步调用结果. 调用BeginInvoke后可随时调用EndInvoke方法;如果C#异步调用未完成,EndInvoke将一直阻塞到C#异步调用完成. 总结其使用大体分5个步骤: 1.声明委拖 2.创建异步方法 3.实例化委拖(把委拖与方法关联)  A 4.通过实例的BeginInvoke调用异步方法 5.通过实例的EndIn