本文由我的新浪博客搬迁过来,由于新浪博客编辑实在蛋疼……
#include
using namespace std;
#define ERROR -1
#define OK 1
#define STACK_INIT_SIZE 100
#define INCREMENT 10
typedef char Elemtype;
typedef int Status;
typedef struct
{
Elemtype *base;
Elemtype *top;
int Stacksize;
}SqStack;
//初始化栈
Status InitStack(SqStack &S)
{
S.base = (Elemtype *)malloc(sizeof(Elemtype) * STACK_INIT_SIZE);
if(!S.base)
return ERROR;
S.top = S.base;
S.Stacksize = STACK_INIT_SIZE;
return OK;
}
//元素入栈
Status PushStack(SqStack &S)
{
Elemtype str;
if(S.top - S.base >= S.Stacksize)
{
S.base = (Elemtype *)realloc(S.base,
(S.Stacksize + INCREMENT) * sizeof(Elemtype)); //realloc为重新分配空间函数,第一个参数为要重新分配的指针名
if(!S.base)
return ERROR;
S.top = S.base + S.Stacksize;
S.Stacksize += INCREMENT;
}
while((str = getchar()) != '#')
*S.top++ = str;
return OK;
}
//判断栈是否为空
bool StackEmpty(SqStack S)
{
if(S.base==S.top)
return true;
else
return false;
}
//显示栈内所有元素
void DisplayStack(SqStack s)
{
if(StackEmpty(s))
exit(-1);
while(s.top!=s.base)
cout<<*(--s.top)<<" ";
}
//栈顶元素出栈
Status PopStack(SqStack &S)
{
Elemtype str;
if(S.top == S.base)
return ERROR;
cout<<"栈顶元素出栈:"<<endl;
str = *--S.top;
cout<<str<<" ";
return OK;
}
//取栈顶元素
Status GetTop(SqStack S)
{
Elemtype e;
if(S.top == S.base)
return ERROR;
e = *--S.top;
cout<<"当前栈顶元素为:"<<e<<endl;
return OK;
}
//求栈的元素个数,即栈长
Status LenStack(SqStack S)
{
int length = 0;
if(S.base == S.top)
return 0;
else
{ while(S.top != S.base)
{
S.top--;
length++;
}//while
return length;
}//else
}
//销毁栈空间
Status DestoryStatck(SqStack &s)
{
s.top=s.base;
free(s.base);
s.base=NULL;
s.top=NULL;
return OK;
}
int main()
{
int length;
SqStack S;
Elemtype str;
InitStack(S); //初始化栈
PushStack(S); //元素入栈
GetTop(S); //求栈顶元素
length = LenStack(S); //求栈长
cout<<"栈的长度为:";
cout<<length<<endl;
PopStack(S); //栈顶元素出栈
cout<<"栈内元素为:"<<endl;
DisplayStack(S); //输出所有栈元素
DestoryStatck(S); //销毁栈
length = LenStack(S);
cout<<"栈的长度为:"<<length<<endl;
return OK;
}