如何实现不限类型的栈或队列

本文介绍了一种使用联合体和结构体实现的通用栈,能够处理多种数据类型,包括基本类型和指针类型。通过定义特定的结构体和联合体,结合类型标记,实现了不同类型数据的压栈和弹栈操作。

如何实现不限类型的栈或队列?

猜想的实现方式:

采用union这种特殊的结构体实现各种类型的表示。

结构体设计:

struct{
        int type;
        union Data{
            char chr;
            unsigned char uchr;
            short sht;
            unsigned short usht;
            int  itr;
            unsigned int uitr;
            long lng;
            unsigned ulng;
            long long lng2;
            unsigned long long ulng2;
            float flt;
            double dbl;
            int * any;
        }data;
}Node;

push的设计:

    void push(char item){
        stack[len].type = 1;
        stack[len].data.chr = item;
        len++;
    }
    void push(unsigned char item){
        stack[len].type = 2;
        stack[len].data.uchr = item;
        len++;
    }
    void push(short item){
        stack[len].type = 3;
        stack[len].data.sht = item;
        len++;
    }
    ……以此类推
    void push(void *item){
        stack[len].type = 13;
        stack[len].data.any = (int *)item;
        len++;
    }

pop的设计:
由于pop没有参数,所以不能采用重载的形式,只能有一个pop函数 。那么如何设计返回类型???
解决方法可能就只有万能指针了。void *

void * pop()
{
    
 Data* tmp = (Data*)malloc(sizeof(Data));
*tmp = stack[len].data;
    if(stack[len].type  < 13){
        len--;
        return tmp;
    } else{
        len--;
        return tmp->any;
    }
}

实验代码:没有检查溢出等情况,只是为了测试功能。

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

using namespace std;

#define MAX_NUM  10

union Data {
    char chr;
    unsigned char uchr;
    short sht;
    unsigned short usht;
    int itr;
    unsigned int uitr;
    long lng;
    unsigned ulng;
    long long lng2;
    unsigned long long ulng2;
    float flt;
    double dbl;
    int *any;
};
struct Node{
    unsigned int type;
    Data data;
};

class Stack
{
    public:
    int len;
    Node stack[MAX_NUM];
    Stack()
    {
        len = 0;
    }
    void push(char chr){
        stack[len].type = 1;
        stack[len].data.chr = chr;
        len++;
    }
    void push(unsigned char chr)
    {
        stack[len].type = 2;
        stack[len].data.uchr = chr;
        len++;
    }
    void push(short chr)
    {
        stack[len].type = 3;
        stack[len].data.sht = chr;
        len++;
    }
    void push(unsigned short chr)
    {
        stack[len].type = 4;
        stack[len].data.usht = chr;
        len++;
    }
    void push(int chr)
    {
        stack[len].type = 5;
        stack[len].data.itr = chr;
        len++;
    }
    void push(unsigned int chr)
    {
        stack[len].type = 6;
        stack[len].data.uitr = chr;
        len++;
    }
    void push(long chr)
    {
        stack[len].type = 7;
        stack[len].data.lng = chr;
        len++;
    }
    void push(unsigned long chr)
    {
        stack[len].type = 8;
        stack[len].data.ulng = chr;
        len++;
    }
    void push(long long chr)
    {
        stack[len].type = 9;
        stack[len].data.lng2 = chr;
        len++;
    }
    void push(unsigned long long chr)
    {
        stack[len].type = 10;
        stack[len].data.ulng2 = chr;
        len++;
    }
    void push(float chr)
    {
        stack[len].type = 11;
        stack[len].data.flt = chr;
        len++;
    }
    void push(double chr)
    {
        stack[len].type = 12;
        stack[len].data.dbl = chr;
        len++;
    }
    void push(void * chr)
    {
        stack[len].type = 13;
        stack[len].data.any = (int *)chr;
        len++;
    }

    void *pop()
    {

        Data *tmp = (Data *)malloc(sizeof(Data));
        *tmp = stack[len-1].data;
        if (stack[len-1].type < 13)
        {
            cout<<"return node"<<endl;
            len--;
            return tmp;
        }
        else
        {
            cout << "return node.any" << endl;
            len--;
            int * x = tmp->any;
            free(tmp);
            return x;
        }
    }

    void display()
    {
        cout << "len" << len << endl;
        for (int i = 0; i < len; i++)
        {
            cout << stack[i].data.lng << endl;
        }
    }

};

class A
{
    public:
        int a;
        ~A(){
            cout<<"disconstructor"<<endl;
        }
};

int main()
{
    char *str = "ccccc";
    A *a = new A();
    a->a = 100;
    printf("%ld\n",str);
    Stack q;
    q.push(1);
    
    q.push(4L);
    q.push(str);
    q.push(a);
    q.display();
    A * res = (A *)q.pop();
    char * xxx = (char *)q.pop();
    int * it = (int *)q.pop();
    
    cout<<res->a<<"     "<<xxx<<"       "<<*it<<endl;
    delete res;
    free(it);

}

## 软件功能详细介绍 1. **文本片段管理**:可以添加、编辑、删除常用文本片段,方便快速调用 2. **分组管理**:支持创建多个分组,类型的文本片段可以分类存储 3. **热键绑定**:为每个文本片段绑定自定义热键,实现一键粘贴 4. **窗口置顶**:支持窗口置顶功能,方便在其他应用程序上直接使用 5. **自动隐藏**:可以设置自动隐藏,减少桌面占用空间 6. **数据持久化**:所有配置和文本片段会自动保存,下次启动时自动加载 ## 软件使用技巧说明 1. **快速添加文本**:在文本输入框中输入内容后,点击"添加内容"按钮即可快速添加 2. **批量管理**:可以同时编辑多个文本片段,提高管理效率 3. **热键冲突处理**:如果设置的热键与系统其他软件冲突,会自动提示 4. **分组切换**:使用分组按钮可以快速切换同类别的文本片段 5. **文本格式化**:支持在文本片段中使用换行符和制表符等格式 ## 软件操作方法指南 1. **启动软件**:双击"大飞哥软件自习室——快捷粘贴工具.exe"文件即可启动 2. **添加文本片段**: - 在主界面的文本输入框中输入要保存的内容 - 点击"添加内容"按钮 - 在弹出的对话框中设置热键和分组 - 点击"确定"保存 3. **使用热键粘贴**: - 确保软件处于运行状态 - 在需要粘贴的位置按下设置的热键 - 文本片段会自动粘贴到当前位置 4. **编辑文本片段**: - 选中要编辑的文本片段 - 点击"编辑"按钮 - 修改内容热键设置 - 点击"确定"保存修改 5. **删除文本片段**: - 选中要删除的文本片段 - 点击"删除"按钮 - 在确认对话框中点击"确定"即可删除
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值