写一个【栈】模板,并实现“任意进制转换器”
2017-05-11 21:19
267 查看
首先我们需要用C++,写一个栈模板,用来套用,下面的程序实现了栈模板。
#ifndef MYSTACK_H
#define MYSTACK_H
#include<cstddef>
template<typename T>
/**************************************************************************************************************/
/* 栈 实现 戚凡 2017-5-10 */
/**************************************************************************************************************/
class MyStack
{
public:
MyStack(int size);
~MyStack();
bool stackEmpty();
bool stackFull();
void clearStack();
int stackLength();
bool push(T elem);
bool pop(T &elem);
void stackTraverse(bool isFromButtom);
private:
T *m_pBuffer;
int m_iSize;
int m_iTop;
};
template<typename T>
MyStack<T>::MyStack(int size) //每个模板函数前都要有template<typename T>,并且需要在函数头插入<T>
{
m_iSize = size;
m_pBuffer = new T[size];
m_iTop = 0;
}
template<typename T>
MyStack<T>::~MyStack()
{
delete[]m_pBuffer;
m_pBuffer = NULL;
}
template<typename T>
bool MyStack<T>::stackEmpty()
{
if(0 == m_iTop)
{
return true;
}
else
{
return false;
}
}
template<typename T>
bool MyStack<T>::stackFull()
{
if(m_iTop == m_iSize)
{
return true;
}
else
{
return false;
}
}
template<typename T>
void MyStack<T>::clearStack()
{
m_iTop = 0;
}
template<typename T>
int MyStack<T>::stackLength()
{
return m_iTop;
}
template<typename T>
bool MyStack<T>::push(T elem)
{
if(stackFull())
{
return false;
}
else
{
m_pBuffer[m_iTop] = elem;
m_iTop++;
//始终指向下一个要入栈的位置 (空位置)
return true;
}
}
template<typename T>
bool MyStack<T>::pop(T &elem) //使用引用意味着使用这个函数的时候,可以使用一个变量
{ //这个变量可以把传给它的值取出去
if(stackEmpty())
{
return false;
}
else
{
m_iTop--;
//与上对应
elem = m_pBuffer[m_iTop];
return true;
}
}
//template<typename T>
//char MyStack<T>::pop()
//{
// if(stackEmpty())
// {
// throw 1;
// }
// else
// {
// m_iTop--;
// return m_pBuffer[m_iTop];
// }
//}
template<typename T>
void MyStack<T>::stackTraverse(bool isFromButtom)
{
using namespace std;
if(isFromButtom)
{
for(int i = 0; i <m_iTop; i ++)
{
cout <<m_pBuffer[i];
// m_pBuffer[i].printCoordinate();
}
}
else
{
for(int i = m_iTop - 1; i >=0 ; i ++)
{
cout <<m_pBuffer[i];
//m_pBuffer[i].printCoordinate();
}
}
}
#endif
如何用栈实现一个任意进制转换器?
#include<iostream>
#include<stdlib.h>
#include"MyStack.h"
using namespace std;
int main(void)
{
char num[]="0123456789ABCDEF";
MyStack<int> *pStack = new MyStack<int>(40) ;
//在此处选择修改套用模板类型
cout<<"Enter a number and a jinzhi(<=16) to shift,e.g:in:2016 16,out:7E0"<<endl;
int N,jz;
while(2==scanf("%d%d",&N,&jz))
{
int mod = 0;
cout<<"将"<<N<<"转换为"<<jz<<"进制,结果为:";
while(N != 0)
{
mod = N % jz;
pStack->push(mod);
N=N/jz;
}
int elem = 0;
while(!pStack->stackEmpty())
{
pStack->pop(elem);
cout<<num[elem];
}
cout<<endl;
}
delete pStack;
pStack = NULL;
system("pause");
return 0;
}
至此任意进制转换器算是完成了(只能到16进制,想要增加进制上限可以添加字母)。下图是运行后的效果:
当然有了这个模板,我们还可以做其他很多事情,比如,实现判断括号是否匹配的程序
#include<iostream>
#include<stdlib.h>
#include<Cstring>
#include"MyStack.h"
using namespace std;
int main(void)
{
MyStack<char> *pStack = new MyStack<char>(40) ;
MyStack<char> *pNeedStack = new MyStack<char>(40) ;
char str[] = "[((]))]";
char currentNeed = 0;
for(int i = 0;i<strlen(str);i++)
{
if(str[i]!=currentNeed)
{
pStack->push(str[i]);
switch(str[i])
{
case'[':
if(currentNeed!=0)
{
pNeedStack->push(currentNeed);
}
currentNeed =']';
break;
case'(':
if(currentNeed!=0)
{
pNeedStack->push(currentNeed);
}
currentNeed =')';
break;
default:
cout<<"字符串括号不匹配"<<endl;
system("pause");
return 0;
}
}
else
{
char elem;
pStack->pop(elem);
if(!pNeedStack->pop(currentNeed))
{
currentNeed = 0;
}
}
}
if(pStack->stackEmpty())
{
cout<<"字符串括号匹配"<<endl;
}
else
{
cout<<"字符串括号不匹配"<<endl;
}
delete pStack;
pStack = NULL;
delete pNeedStack;
pStack = NULL;
system("pause");
return 0;
}
#ifndef MYSTACK_H
#define MYSTACK_H
#include<cstddef>
template<typename T>
/**************************************************************************************************************/
/* 栈 实现 戚凡 2017-5-10 */
/**************************************************************************************************************/
class MyStack
{
public:
MyStack(int size);
~MyStack();
bool stackEmpty();
bool stackFull();
void clearStack();
int stackLength();
bool push(T elem);
bool pop(T &elem);
void stackTraverse(bool isFromButtom);
private:
T *m_pBuffer;
int m_iSize;
int m_iTop;
};
template<typename T>
MyStack<T>::MyStack(int size) //每个模板函数前都要有template<typename T>,并且需要在函数头插入<T>
{
m_iSize = size;
m_pBuffer = new T[size];
m_iTop = 0;
}
template<typename T>
MyStack<T>::~MyStack()
{
delete[]m_pBuffer;
m_pBuffer = NULL;
}
template<typename T>
bool MyStack<T>::stackEmpty()
{
if(0 == m_iTop)
{
return true;
}
else
{
return false;
}
}
template<typename T>
bool MyStack<T>::stackFull()
{
if(m_iTop == m_iSize)
{
return true;
}
else
{
return false;
}
}
template<typename T>
void MyStack<T>::clearStack()
{
m_iTop = 0;
}
template<typename T>
int MyStack<T>::stackLength()
{
return m_iTop;
}
template<typename T>
bool MyStack<T>::push(T elem)
{
if(stackFull())
{
return false;
}
else
{
m_pBuffer[m_iTop] = elem;
m_iTop++;
//始终指向下一个要入栈的位置 (空位置)
return true;
}
}
template<typename T>
bool MyStack<T>::pop(T &elem) //使用引用意味着使用这个函数的时候,可以使用一个变量
{ //这个变量可以把传给它的值取出去
if(stackEmpty())
{
return false;
}
else
{
m_iTop--;
//与上对应
elem = m_pBuffer[m_iTop];
return true;
}
}
//template<typename T>
//char MyStack<T>::pop()
//{
// if(stackEmpty())
// {
// throw 1;
// }
// else
// {
// m_iTop--;
// return m_pBuffer[m_iTop];
// }
//}
template<typename T>
void MyStack<T>::stackTraverse(bool isFromButtom)
{
using namespace std;
if(isFromButtom)
{
for(int i = 0; i <m_iTop; i ++)
{
cout <<m_pBuffer[i];
// m_pBuffer[i].printCoordinate();
}
}
else
{
for(int i = m_iTop - 1; i >=0 ; i ++)
{
cout <<m_pBuffer[i];
//m_pBuffer[i].printCoordinate();
}
}
}
#endif
如何用栈实现一个任意进制转换器?
#include<iostream>
#include<stdlib.h>
#include"MyStack.h"
using namespace std;
int main(void)
{
char num[]="0123456789ABCDEF";
MyStack<int> *pStack = new MyStack<int>(40) ;
//在此处选择修改套用模板类型
cout<<"Enter a number and a jinzhi(<=16) to shift,e.g:in:2016 16,out:7E0"<<endl;
int N,jz;
while(2==scanf("%d%d",&N,&jz))
{
int mod = 0;
cout<<"将"<<N<<"转换为"<<jz<<"进制,结果为:";
while(N != 0)
{
mod = N % jz;
pStack->push(mod);
N=N/jz;
}
int elem = 0;
while(!pStack->stackEmpty())
{
pStack->pop(elem);
cout<<num[elem];
}
cout<<endl;
}
delete pStack;
pStack = NULL;
system("pause");
return 0;
}
至此任意进制转换器算是完成了(只能到16进制,想要增加进制上限可以添加字母)。下图是运行后的效果:
当然有了这个模板,我们还可以做其他很多事情,比如,实现判断括号是否匹配的程序
#include<iostream>
#include<stdlib.h>
#include<Cstring>
#include"MyStack.h"
using namespace std;
int main(void)
{
MyStack<char> *pStack = new MyStack<char>(40) ;
MyStack<char> *pNeedStack = new MyStack<char>(40) ;
char str[] = "[((]))]";
char currentNeed = 0;
for(int i = 0;i<strlen(str);i++)
{
if(str[i]!=currentNeed)
{
pStack->push(str[i]);
switch(str[i])
{
case'[':
if(currentNeed!=0)
{
pNeedStack->push(currentNeed);
}
currentNeed =']';
break;
case'(':
if(currentNeed!=0)
{
pNeedStack->push(currentNeed);
}
currentNeed =')';
break;
default:
cout<<"字符串括号不匹配"<<endl;
system("pause");
return 0;
}
}
else
{
char elem;
pStack->pop(elem);
if(!pNeedStack->pop(currentNeed))
{
currentNeed = 0;
}
}
}
if(pStack->stackEmpty())
{
cout<<"字符串括号匹配"<<endl;
}
else
{
cout<<"字符串括号不匹配"<<endl;
}
delete pStack;
pStack = NULL;
delete pNeedStack;
pStack = NULL;
system("pause");
return 0;
}
相关文章推荐
- C++模板来实现一个通用的内存池.
- 编程技术感想——一个用模板实现的assert
- 一个简洁的归并排序实现模板
- 一个模板单例的实现
- 设计技巧15:模板方法 Template Method 在一个方法中定义一个算法的骨架,而将一些步骤延迟的子类中,实现Ioc
- js实现datagrid 模板列中有多个checkbox 时只许选中一个..........
- singleton pattern的一个模板实现, 适用于单线程
- 求数组中的最大值--分别用非类,类,带一个参数的类模板,带2个参数的类模版实现
- Juicer – 一个Javascript模板引擎的实现和优化
- 归并排序(merge sort)的一个基于模板的实现
- 一个简单的模板系统的实现(动态载入DLL)
- 如何实现 画一个屏幕的渐变效果,并将其作为程序的背景模板
- 如何实现一个带引用记数的智能指针模板
- 实现将student中的所有信息在一个模板页上显示,格式参考课件中的图片。并实现编辑功能
- 模板实现一个通用栈
- 一个用模板实现的计数基类
- 实现一个Hibernate模板
- 一个支持线程安全的模板方式实现的内存分配器
- Juicer – 一个Javascript模板引擎的实现和优化
- 【25】实现一个含有min函数的栈的通用模板