c语言万能编程模板_C语言利用模板实现简单的栈类

本文介绍了如何使用C++模板类实现基于数组和单链表的栈,包括入栈、出栈、获取栈的大小和判断栈是否为空等基本操作。通过数组实现的栈在内存分配上较为固定,而单链表实现的栈在动态增删元素时更加灵活。文章提供了完整的代码示例,并附带了测试用例。
摘要由CSDN通过智能技术生成

本文实例为大家分享了C语言利用模板实现简单的栈类(数组和单链表),供大家参考,具体内容如下

主要的功能是实现一个后进先出的列表,有入栈、出栈、返回大小、判空等基本功能

#pragma once

using namespace std;

const int MAXSIZE = 0xfff;

template

class Class_Linkstack

{

int top;

type* my_s;

int max_size;

public:

Class_Linkstack() :top(-1), max_size(MAXSIZE)

{

my_s = new type[max_size];

if (my_s == NULL)

{

cerr << "动态存储分配失败!" << endl;

exit(1);

}

}

Class_Linkstack(int size) :top(-1), max_size(size)

{

my_s = new type[size];

if (my_s == NULL)

{

cerr << "动态存储分配失败!" << endl;

exit(1);

}

}

~Class_Linkstack() { delete[] my_s; }

bool Empty_Linkstack();

void Push_Linkstack(type tp);

void Pop_Linkstack();

type Top_Linkstack();

int Size_Linkstack();

void Print_Linkstack();

};

template

void Class_Linkstack::Print_Linkstack()

{

if (top == -1)

cout << "空栈" << endl;

else

{

for (int i = 0; i < top+1; i++)

cout << my_s[i] << '\t';

}

}

template

bool Class_Linkstack::Empty_Linkstack()

{

if (top == -1)

return true;

else

{

return false;

}

}

template

void Class_Linkstack::Push_Linkstack(type tp)

{

if (top + 1 < max_size)

my_s[++top] = tp;

else

{

cout << "栈已满" << endl;

exit(1);

}

}

template

void Class_Linkstack::Pop_Linkstack()

{

if (top == -1)

{

cout << "为空栈" << endl;

exit(1);

}

else

{

my_s[top--] = 0;

}

}

template

type Class_Linkstack::Top_Linkstack()

{

if (top != -1)

return my_s[top];

else

{

cout << "为空栈" << endl;

exit(1);

}

}

template

int Class_Linkstack::Size_Linkstack()

{

return top + 1;

}

测试代码

#include "Class_Linkstack.h"

int main()

{

Class_Linkstack sk1(5);

for (int i = 0; i < 5;i++ )

sk1.Push_Linkstack(i * 2 + 1);

sk1.Print_Linkstack();

system("pause");

return 0;

}

补充(通过单链表实现)

上面是通过数组来实现,与数组相比,链表实现更灵活,更容易增删元素。

单链表实现的核心思想是不断更新栈顶指针,来实现出栈压栈,每一个节点是一个结构体,包含一个value和一个next指针指向下一个元素,初始化时将栈顶指针置为NULL。

#pragma once

using namespace std;

template

struct listnode

{

type value;

listnode* next;

listnode(type v,listnode* p):value(v),next(p){ }

};

template

class List_stack

{

listnode* top;

int size = 0;

public:

List_stack();

void Push(type &tp);

void Pop();

bool Empty();

int Size();

void Print();

~List_stack()

{

while (top)

{

listnode * p = top;

top = top->next;

delete p;

}

}

};

template

bool List_stack::Empty()

{

if (top == NULL)

return true;

else

{

return false;

}

}

template

List_stack::List_stack()

{

top = NULL;

size = 0;

}

template

void List_stack::Push(type &tp)

{

listnode *tmp=new listnode(tp,top);

top = tmp;

size++;

}

template

void List_stack::Pop()

{

if (top == NULL)

{

cout << "为空栈" << endl;

}

else

{

top = top->next;

size--;

}

}

template

int List_stack::Size()

{

return size;

}

template

void List_stack::Print()

{

listnode* tmp = top;

while (tmp != NULL)

{

cout << tmp->value << '\t';

tmp = tmp->next;

}

}

简单测试:

int main()

{

List_stack ls;

for (int i = 0; i < 5; i++)

ls.Push(i);

ls.Print();

ls.Pop();

ls.Pop();

cout << endl;

ls.Print();

cout << endl;

cout << ls.Size();

system("pause");

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值