#include<stdio.h>
/*栈的知识点
一.关于栈的一般知识点
1.栈的操作受限的线性表——插入,删除,取出元素的操作 只能在栈顶一端
2.栈的逻辑结构本质是线性结构,任可表示为(a1,a2,....ai-1,ai,ai+1...an)
3.栈的结构是人为赋予了它特定的规律的线性表
4.栈的基本操作:先进后出(后进先出)
5.栈的基本操作的时间复杂度 是0(1)
二.顺序栈的编程要点
1.顺序栈类似顺序表,包括一个一维数组来装找元素, 一个栈顶指针,指向栈顶位置,
一般的栈顶指针可以是栈顶元素的物理索引,或栈顶元素的物理索引的下一个位置
本代码中,使用第一种方式
2.顺序栈分小端栈,大端栈,共享栈
3.同所有的顺序结构,插入操作要先判满(连锁式结构 不用先判满)
4.同所有顺序结构和链式结构,删除操作要先判空
5.本代码中,顺序栈的栈空表示:栈顶指针top==-1
*/
#define MaxSize 10
typedef int DataType;
typedef struct{
DataType data[MaxSize];
int top;
}SeqStack;
//初始化顺序栈
void InitStack(SeqStack *st);
//判空
int IsEmpty(SeqStack *st);
//入栈
int Push(SeqStack *st,DataType elem);
//出栈
int Pop(SeqStack *st,DataType elem);
//取栈顶元素
int GetTopElem(SeqStack *st,DataType elem);
//生成顺序栈---不是基本操作,用来方便测试基本操作
void CreateStack(SeqStack *st,DataType a[],int n);
//打印顺序栈---不是基本操作,用来方便测试基本操作
void PrintfStack(SeqStack st);
int main() {
SeqStack st;
DataType elem;
printf("...........初始化顺序栈............\n");
InitStack(&st);
if(IsEmpty(st)){
printf("初始化顺序栈成功。\n");
}else{
printf("初始化顺序栈失败。\n");
}
printf("...........生成顺序栈............\n");
int n=5;
DataType a[] ={1,2,3,4,5};
CreateStack(&st, a, n);
PrintfStack(st);
printf("...........入栈..............\n");
if(Push(&st,6)){
printf("入栈成功。\n");
PrintfStack(st);//6 5 4 3 2 1
}else{
printf("入栈失败。/n");
printStack(st);//5 4 3 2 1
}
printf("..........出栈..........\n");
if(Pop(&st,&elem)){
printf("出栈成功。出栈元素:%4d\n",elem);//6
PrintfStack(st);//5 4 3 2 1
}else{
printf("出栈失败。/n");
printStack(st);//6 5 4 3 2 1
}
printf("...................取栈顶元素...............\n");
if(GetTopElem(st,&elem)){
printf("取栈顶元素成功。得到的栈元素是:%d\n",elem);
PrintfStack(st);
}else{
printf("取栈顶元素成功。")
}
return 0;
}
//初始化顺序栈
void initStack(SeqStack *st){
st->top = -1;
}
//判空
int ISEmpty(SeqStack st){
if(st.top == -1){
return 1;
}
return 0;
}
//入栈
int Push(SeqStack *st,DataType elem){
if(st->top == MaxSize - 1){
printf("顺序栈已满,无法入栈。\n");
return 0;
}
st->top++;
st->data[st->top] = elem;
//st->data[++st->top] = elem;
return 1;
}
//出栈
int Pop(SeqStack *st,DataType *elem){
if(st->top == -1){
printf("顺序栈以空,无法出栈。\n");
return 0;
}
*elem = st->data[st->top];
st->top--;
//elem = st->data[st->top--];
return 1;
}
//取栈顶元素
int GetTopElem(SeqStack st,DataType *elem){
if(st.top == -1){
printf("顺序栈以空,无法取得栈顶元素。\n");
return 0;
}
*elem = st->data[st.top];
//st->top--;
return 1;
}
//生成顺序栈---不是基本操作,用来方便测试基本操作
void CreateStack(SeqStack *st,DataType a[],int n){
int i;
for(i=0;i<n;i++){
Push(st,a[i]);
}
}
//打印顺序栈---不是基本操作,用来方便测试基本操作
void PrintfStack(SeqStack st){
if(IsEmpty(st)){
printf("栈空,无元素打印。\n");
return ;
}
int i;
for(i=st.top;i>=0;i--){
printf("%4d",st,data[i]);
}
printf("/n");
}
}
int main() {
return 0;
}