顺序栈
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef int SElemType;
typedef struct{
SElemType *base;
int top;
int stacksize;
}Stack;
bool initStack(Stack&stack,int size)
{
stack.base= new SElemType[size];
if(!stack.base)
return 0;
stack.stacksize=size;
stack.top=0;
return 1;
}
bool Push(Stack&stack, SElemType str)
{
if(stack.top>=stack.stacksize)
return 0;
stack.base[++stack.top]=str;
return 1;
}
bool Pop(Stack&stack,SElemType& e)
{
if(stack.top<=0)
{
stack.top=0;
return 0;
}
e=stack.base[stack.top];
stack.top--;
return 1;
}
void freeStack(Stack&stack)
{
delete[] stack.base;
}
SElemType TopStack(Stack&stack)
{
return stack.base[stack.top];
}
int main(int argc, char* argv[])
{
Stack stack;
initStack(stack,50);
for(int i=0;i<49;i++)//测试入栈
{
Push(stack,i);
}
cout<<TopStack(stack)<<endl;
for(int j=0;j<2;j++)//测试出栈
{
SElemType e;
Pop(stack,e);
}
cout<<TopStack(stack)<<endl;
freeStack(stack);
return 0;
}
顺序栈解释:说白了就是开一个动态数组,进栈就是向里添加数据,数组角标由小到大递增,而出栈就是将添加了的最大角标递减,so Easy!栈有很多应用 如:编译,匹配括号,走迷宫等等
链式栈
#include "stdafx.h"
#include <stdio.h>
#include<iostream.h>
template<typename T> class Stack
{
public:
Stack<T>();
~Stack<T>();
void Push(const T&);
T Pop();
void clear();
T GetTopData() const;
private:
typedef struct nodeStack{
T data;
nodeStack *last;
}*LinkStack;
LinkStack _linkStack;
};
int main(int argc, char* argv[])
{
Stack<char*> stack;
stack.Push("栈1");
cout<<"入栈"<<endl;
cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl;
stack.Push("栈2");
cout<<"入栈"<<endl;
cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl;
stack.Push("栈3");
cout<<"入栈"<<endl;
cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl;
stack.Push("栈4");
cout<<"入栈"<<endl;
cout<<"入栈后栈顶:"<<stack.GetTopData()<<endl<<endl;
char *c=stack.Pop();
cout<<"出栈"<<endl;
cout<<"出栈后栈顶:"<<stack.GetTopData()<<" 上次出栈的值:"<<c<<endl;
c= stack.Pop();
cout<<"出栈"<<endl;
cout<<"出栈后栈顶:"<<stack.GetTopData()<<" 上次出栈的值:"<<c<<endl;
return 0;
}
template<typename T> Stack<T>::Stack()
{
_linkStack=new nodeStack();
_linkStack->last=NULL;
_linkStack->data=(T)NULL;
}
template<typename T> Stack<T>::~Stack()
{
clear();
}
template<typename T> void Stack<T>::Push(const T&t)
{
LinkStack ls=new nodeStack;
ls->last=_linkStack;
ls->data=t;
_linkStack=ls;
}
template<typename T> T Stack<T>::Pop()
{
T t=NULL;
if(_linkStack)
{
LinkStack ls;
ls=_linkStack->last;
if(!ls)//如果是底栈
return (T)NULL;
t=_linkStack->data;//输出当前出栈数据
delete _linkStack; //删除当前栈
_linkStack=ls; //把前一个栈指针指向当前栈
}
return t;
}
template<typename T> void Stack<T>::clear()
{
while(_linkStack)
{
Pop();
}
}
template<typename T> T Stack<T>::GetTopData() const
{
if(!_linkStack)
return (T)NULL;
return (T)_linkStack->data;
}
输出: