asdaaa

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值