(1)、栈是一个线性存储结构(逻辑线性) ; 单端进出数据,特点:先进后出。
栈一般都是由栈顶指针和栈底指针组成,top;
栈处理数据的特点 : 入栈和出栈;
栈一般情况下是不存在遍历操作,不允许指定下标操作,只能对栈顶元素进行操作;
(2)、栈存储结构的实现:数组方式或链表方式;
头文件
stack.h
#ifndef __STACK_H__
#define __STACK_H__
#include<iostream>
#include<assert.h>
using namespace std;
#define ElemType int
#define STACK_INIT_SIZE 8
typedef struct Stack
{
ElemType *base;
size_t capacity;
int top;
}Stack;
///////////////////////////////////////////////////////////////////////////
void InitStack(Stack *st);
void PushStack(Stack *st,ElemType x);
bool IsFull(Stack *st);
bool IsEmpty(Stack *st);
void ShowStack(Stack *st);
void PopStack(Stack *st);
ElemType GetTop(Stack *st);
void ClearStack(Stack *st);
///////////////////////////////////////////////////////////////////////////
void InitStack(Stack *st)
{
st->base = (ElemType*)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
assert(st->base != NULL);
st->capacity = STACK_INIT_SIZE;
st->top = 0;
}
bool IsFull(Stack *st)
{
return st->top >= st->capacity;
}
bool IsEmpty(Stack *st)
{
return st->top == 0;
}
void PushStack(Stack *st,ElemType x)
{
if(IsFull(st))
{
cout<<"栈已满,"<<x<<"无法入栈!"<<endl;
}
st->base[st->top]=x;
st->top++;
}
void ShowStack(Stack *st)
{
for(int i =STACK_INIT_SIZE-1;i>=0;--i)
{
cout<<i<<":";
if(i >= st->top)
{
cout<<"NUL."<<endl;
}
else
{
cout<<st->base[i]<<"."<<endl;
}
}
cout<<endl;
}
void PopStack(Stack *st)
{
if(IsEmpty(st))
{
cout<<"栈内已经清空 ,不能出栈了!"<<endl;
}
st->top--;
}
ElemType GetTop(Stack *st)
{
if(IsEmpty(st))
{
cout<<"栈内已经清空 ,不能获取顶部元素!"<<endl;
}
assert(!IsEmpty(st));
return st->base[st->top-1];
}
void ClearStack(Stack *st)
{
st->top=0;
}
#endif
源文件
#include<iostream>
#include"Stack.h"
using namespace std;
int main()
{
Stack st;
InitStack(&st);
PushStack(&st,1);
PushStack(&st,2);
PushStack(&st,3);
PushStack(&st,4);
PushStack(&st,5);
PushStack(&st,6);
ShowStack(&st);
ElemType item=GetTop(&st);
cout<<item<<"出栈"<<endl;
PopStack(&st);
PopStack(&st);
PopStack(&st);
ShowStack(&st);
PushStack(&st,10);
ShowStack(&st);
GetTop(&st);
system("pause");
return 0;
}