来源于 [维基百科,自由的百科全书]
堆栈
(重定向自
堆疊)
堆栈(英文:stack),在计算机科学中,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端(称为堆栈顶端指标,英文为top)进行加入资料(push)和输出资料(pop)的运算。另外堆栈也可以用一维数组或链表的形式来完成。
由于堆栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。
堆栈数据结构使用两种基本操作:推入(push)和弹出(pop):
| :将数据放入堆栈的顶端(阵列形式或串行形式),堆栈顶端top指标加一。 |
| :将顶端数据资料输出(回传),堆栈顶端资料减一。 |
#pragma once
typedef char DataType;
const int MaxStatckSize = 50; //栈大小
class StackDemo
{
private:
DataType stacklist[MaxStatckSize];
int top;//栈顶
public:
//构造函数
StackDemo(void);
~StackDemo(void);
public:
//压栈出栈操作
void Push(const DataType &item);
DataType Pop(void);
void ClearStack(void);
//访问栈顶
DataType Peek(void)const;
//检测椎栈
bool isEmpty(void)const;
bool isFull(void)const;
};
头文件stackDemo.h
#include "StackDemo.h"
#include <iostream>
StackDemo::StackDemo(void)
{
this->top = -1;
}
StackDemo::~StackDemo(void)
{
this->top = -1;
}
void StackDemo::Push(const DataType &item)
{
//栈是否已满
if(!isFull())
{ top += 1;
this->stacklist[top] = item;
}
else
std::cout << "Out of the Stack!" << std::endl;
}
DataType StackDemo::Pop(void)
{
if(!isEmpty())
{
int ebp = top;
top -= 1;
return stacklist[ebp];
}
else
return -1;
}
DataType StackDemo::Peek(void)const
{
return top;
}
void StackDemo::ClearStack()
{
for(int i = top;i >=0 ;i--)
stacklist[i] = 0;
top = -1;
std::cout << "Clear stack done!" << std::endl;
}
bool StackDemo::isFull(void)const
{
return top > MaxStatckSize?true:false;
}
bool StackDemo::isEmpty(void)const
{
return top < 0 ?true:false;
}
实现 stackDemo.cpp
#include <iostream>
#include "StackDemo.h"
using namespace std;
int main()
{
StackDemo *sd = new StackDemo();
sd->Push(10);//压栈
sd->Push(20);//压栈
sd->Push(30);//压栈
cout << "Stack TOP:" << sd->Peek() << endl;
cout << "POP:" << sd->Pop() << endl;
system("pause");//暂停
return 0;
}
main.cpp
维基百科,自由的百科全书
回文,亦称回环,是正读反读都能读通的句子,亦有将文字排列成圆圈者,是一种修辞方式和文字游戏。回环运用得当,可以表现两种事物或现象相互依靠或排斥的关系。
//把StackDemo typedef int DataType 改为 typedef char DataType
#include <iostream>
#include "StackDemo.h"
using namespace std;
void Deblank(char *s,char *t)
{
while(*s != NULL)
{
//扫描整个串
if(*s != ' ') //不是空格
*t = *s;
*s ++;
*t ++;
}
*t = NULL;
}
int main()
{
StackDemo *S = new StackDemo();//回文栈
char palstring[80],deblankstring[80],c;
cout << "Enter some chars with a 'n' to stop" << endl;
cin.getline(palstring,80,'n');//以n结束
bool isPalindrome = true; //假定是回文
//去除空格
Deblank(palstring,deblankstring);
//将字符串压栈
int i = 0;
while(deblankstring[i] !='\0')
{
S->Push(deblankstring[i]);
i++;
}
i = 0;
//出栈并比较
while((c = S->Pop()) != -1)
{
if(c != deblankstring[i])
{
isPalindrome = false;
break;
}
i++;
}
if(isPalindrome)
cout << palstring << " is a palindromic string" << endl;
else
cout << palstring << " is not a palindromic string" << endl;
system("pause");//暂停
return 0;
}