#include
using namespace std;
template
class Stack
{
public:
Stack(int iLenth);
~Stack(){delete[] m_p;}
Type Pop();
void Push(Type newData);
Type GetData();
private:
int m_iMaxLenth;
int m_iCurLenth;
Type *m_p;
};
template
Stack::Stack(int iLenth)
: m_iMaxLenth(iLenth)
, m_iCurLenth(0)
{
m_p = new Type[m_iMaxLenth];
if (NULL == m_p)
throw(1);
}
template
Type Stack::Pop()
{
if (NULL == m_p)
throw(2);
if (0 == m_iCurLenth)
throw(3);
Type k = m_p[--m_iCurLenth];
return k;
}
template
void Stack::Push(const Type newData)
{
if (NULL == m_p)
throw(2);
if (m_iCurLenth == m_iMaxLenth)
throw(4);
m_p[m_iCurLenth++] = newData;
}
template
Type Stack::GetData()
{
if (NULL == m_p)
throw(2);
if (0 == m_iLenth)
throw(3);
return m_p[m_iCurLenth-1];
}
int _tmain(int argc, _TCHAR* argv[])
{
Stack s(10);
for(int i=0; i<10; i++)
{
s.Push(i);
}
for(int i=0; i<10; i++)
{
cout << s.Pop() << endl;
}
}
【1】类定义最后一定要加分号的!【2】int Stack ::pop()定义最后多了分号!
------------------------------------------------------------------------------------------------------
最后虽然运行成功,但是是有问题的!按你的定义,栈为空时tos=0;但你却把第一个入栈的赋给了stck[0]了,而应该是赋给stck[1]的!!!!
----------------------------------------------------------------------------------------------------
1.既然是C++,建议把# include 改为:
#include
using namespace std;
否则,在高版本,例如,我在vs2010运行会编译错误的
2.既然用数组,建议把tos初始值改为-1,而不是0,这样10个元素就是stck[0]到stck[9]了。
3.void Stack ::push(int m)中的
stck[tos]=m;tos++;写反了!!应倒过来。
这样的话,而int Stack ::pop()也写反了;但若改成:
return stck[tos];tos--;又有问题,因为根本不会执行tos--;语句;那怎么办??我们可以赋给一个临时变量:
int temp;temp=stck[tos];tos--;return temp;4."如果栈溢出,程序终止。"并没有实现!!建议把int Stack ::pop()中的return;改为exit(1);包括判断栈为空里也应该写成exit(1);
5.建议把栈初始实现在类的构造函数里,而不是在init()里。
6.建议不要把没形参的函数直接(),可以(void);
7.建议把void main(){}形式改为int main(){return 0;}形式
# include using namespace std;const int SIZE=10;class Stack{int stck[SIZE];int tos;public:Stack(void); void push(int m);int pop(void);};Stack ::Stack(void){ tos=-1; }void Stack ::push(int m){if(tos==SIZE-1){ cout<<"stack is full
"; exit(1); }tos++; //倒过来!!stck[tos]=m;}int Stack ::pop(void){if(tos==-1){ cout<<"stack is empty
"; exit(1);}int temp; //用变量temp临时存储stck[tos]的值!temp=stck[tos];tos--;return temp;}int main(){ int i; Stack a; a.push(10); a.push(12); a.push(14); for (i=0;i<3;i++) cout<<a.pop()<<"
";return 0; }
栈是什么意思?
栈,又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶...
栈是什么意思?
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表(LIFO--Last IN First Out表)。栈可以用来...
“入栈出栈”的意思是什么?
栈的特点是先进后出,即:进去的早,出来的晚!54321进栈,5在栈底,1在栈顶!出一次栈,则栈顶的1先出来,2成为新的栈顶。ABCD入栈,D成为新的栈顶。全部出栈:D C B A 2 3 4 5 综上,所有元素退栈顺序为:1 D C B A 2 3 4 5 ...
如何理解栈的生长方向
栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。从一个栈删除元素又称作出栈或退栈,它是把栈顶元素...
c++中的栈先进先出吗?堆又是如何的?
1、这个所谓的其实就是栈了。至于你想说堆嘛,其实并不是一种数据结构,而是有一定的计算机组成的意味了,是一个逻辑上的概念,和栈不同,因为栈是一种数据结构。2、an-1的顺序进行进栈;而出栈的顺序则需要反过来,按照“后存放的先取,先存放的后取”的原则进行,则an-1先退出栈,然后an-2...
栈的定义是什么
栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素...
出栈的计算机术语
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把...
栈的链式存储结构
栈:又名堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。从一个栈删除元素又称作出栈或退栈,它是把栈顶...
在c中什么是退栈??
退栈就是指把一个数据从栈里删除,也就是从栈顶取出一个元素(该数据不用保存,如是出栈操作则该数据要保存)。。。同时栈顶指针减一。。。
栈是先进后出还是后进先出
弹栈(出栈):从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。四、应用场景:括号匹配:在编程中,括号匹配功能可以通过使用栈来实现。当遇到左括号时,将其压入栈中;当遇到右括号时,检查其是否与栈顶的左括号匹配,如果匹配则弹出栈顶的左括号。深...