C语言实现堆栈链式存储

#include<stdio.h>
#include<stdlib.h>
typedef struct My_Stack *PStack;
struct My_Stack
{
    int Data;
    PStack Next;
} ;
PStack Create_Stack()
{
    PStack s;
    s=(PStack)malloc(sizeof(struct My_Stack));
    s->Next=NULL;
    return s;
}
int IsEmpty(PStack s)
{
    return(s->Next==NULL);
}
int Stack_Pop(PStack s)
{
    if(IsEmpty(s)==1)
    {
        printf("堆栈空\n");
        return NULL;
    }
    else
    {
        struct My_Stack *p;
        int TopElem;
        p=s->Next;
        s->Next=p->Next;
        TopElem=p->Data;
        free(p);
        return TopElem;
    }

}

void Stack_Push(PStack s,int Elem)
{
    struct My_Stack *p;
    p=(PStack)malloc(sizeof(struct My_Stack));
    p->Data=Elem;
    p->Next=s->Next;
    s->Next=p;

}
void Stack_ReadAll(PStack s)
{
    if(IsEmpty(s)==1)
    {
        printf("堆栈空\n");

    }
    else
    {
        struct My_Stack *p;
        p=s->Next;
        while((p->Next)!=NULL)
        {
            printf("%d ",p->Data);
            p=p->Next;
        }
        printf("%d",p->Data);
    }


}
int main()
{
    struct My_Stack *Stack1=Create_Stack();
    while(1)
    {
         printf("输入需要的操作:\nA.显示堆栈状态\nB.Push\nC.Pop\nD.退出\n");
         char c;
         scanf("%c",&c);
         if(c=='A')
         {
             printf("堆栈状态:");
             Stack_ReadAll(Stack1);
         }
         else if(c=='B')
         {
             printf("输入:");
             int a;
             scanf("%d",&a);
             Stack_Push(Stack1,a);

         }
         else if(c=='C')
         {
             int a=Stack_Pop(Stack1);
             printf("输出:%d",a);
         }
         else if(c=='D')
         {
             break;
         }
         else
         {
             printf("无效输入\n");
         }
         char m=getchar();

    }


    return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
(1)用带表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同值。链表的头结点存放链表后面的结点个数,初始化时就生成头结点(初值为0)。链表翻转是把数据逆序(变成降序),注意,头结点不动。翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错。 (2)先定义堆栈的几个基本操作,再设计一主函数利用堆的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:...[...{...}...[...]...]...(...))。编写判别给定表达式中所含括号是否正确配对出现的算法,已知表达式已存入数据元素为字符的单链表中。 (3)先定义队列的几个基本操作,再设计一主函数利用队列的操作完成以下功能:键盘输入的字符可以临时存入键盘的缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计成链式循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。每输入一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。假设有两个进程同时存在于一个应用程序中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值