您的位置:首页 > 其它

写一个【栈】模板,并实现“任意进制转换器”

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: