栈的操作(创建,入栈,出栈,清空,遍历等等)

9 篇文章 0 订阅
7 篇文章 0 订阅
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>


typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;


typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;


void init(PSTACK pS);
void push (PSTACK pS,int val);
void traverse(PSTACK pS);
bool pop(PSTACK pS,int * pVal);
bool empty(PSTACK pS);
void clear(PSTACK pS);


int main()
{
    STACK S;
int val;




init(&S);//造出一个空栈
for(int i=0;i<=15;i++)
{
      push(&S,i);
}
/*
push(&S,1);//压栈
push(&S,3);
push(&S,4);
push(&S,5);
push(&S,13);
push(&S,11);
*/
    traverse(&S);//遍历输出
//出栈
//pop(&S,&val);
if(pop(&S,&val))
{
printf("出栈成功,出栈的元素是%d\n",val);
}
else
{
     printf("出栈成功");
}
     traverse(&S);//遍历输出



//traverse(&S);//遍历输出


    clear(&S);//清空


    if(empty(&S))
{
printf("栈为空\n ");
}
else
{
          printf("栈为非空\n");
}


return 0;
}


void init(PSTACK pS)
{
pS->pTop=(PNODE)malloc(sizeof(NODE));
if(NULL==pS->pTop)
{
printf("动态内存分配失败");
exit(-1);
}
else
{
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL;
}


}


void push (PSTACK pS,int val)
{
PNODE pNew=(PNODE)malloc(sizeof(NODE));


pNew->data=val;
pNew->pNext=pS->pTop;
pS->pTop=pNew;
return;
}
void traverse(PSTACK pS)
{
PNODE p=pS->pTop;


while(p!=pS->pBottom)
{
printf("%d  ",p->data);
p=p->pNext;
}
printf("\n");
}


bool empty(PSTACK pS)
{
if(pS->pTop==pS->pBottom)
{
return true;
}
else
{
return false;
}
}
bool pop(PSTACK pS,int * pVal)
{
if(empty(pS))//pS存放的就是栈的地址
{
return true;
}
else
{
        PNODE r = pS->pTop;
* pVal = r->data;
pS->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
}
void clear(PSTACK pS)
{
if(empty(pS))
{
return;
}
else
{
PNODE p=pS->pTop;
PNODE q=NULL;
while(p!=pS->pBottom)
{
q=p->pNext;
free(p);
p=q;
}
pS->pTop=pS->pBottom;
}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实顺序的基本算法包括初始化、入栈出栈、取顶元素、遍历、置空等操作。下面是各种基本运算的算法: 1. 初始化操作创建一个空,即将顶指针指向-1。 2. 入栈操作:将元素压入栈顶,即将顶指针加1,然后将元素存入该位置。 3. 出栈操作:将顶元素弹出,即将顶指针减1,然后返回该位置的元素。 4. 取顶元素操作:返回顶元素,即返回顶指针所指位置的元素。 5. 遍历操作:从底到顶依次输出栈中元素。 6. 置空操作:将清空,即将顶指针重置为-1。 下面是一个主程序的示例,它实现了上述基本运算: ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int top; } SequenStack; void Init_SequenStack(SequenStack* s) { s->top = -1; } void Push_SequenStack(SequenStack* s, int x) { if (s->top == MAXSIZE - 1) { printf("Stack overflow!\n"); exit(1); } s->top++; s->data[s->top] = x; } int Pop_SequenStack(SequenStack* s) { if (s->top == -1) { printf("Stack underflow!\n"); exit(1); } int x = s->data[s->top]; s->top--; return x; } int GetTop_SequenStack(SequenStack* s, int* x) { if (s->top == -1) { printf("Stack is empty!\n"); return 0; } *x = s->data[s->top]; return 1; } void Traverse_SequenStack(SequenStack* s) { if (s->top == -1) { printf("Stack is empty!\n"); return; } for (int i = 0; i <= s->top; i++) { printf("%d ", s->data[i]); } printf("\n"); } void Clear_SequenStack(SequenStack* s) { s->top = -1; } int main() { SequenStack s; Init_SequenStack(&s); Push_SequenStack(&s, 1); Push_SequenStack(&s, 2); Push_SequenStack(&s, 3); int x; GetTop_SequenStack(&s, &x); printf("Top element: %d\n", x); Traverse_SequenStack(&s); Pop_SequenStack(&s); Traverse_SequenStack(&s); Clear_SequenStack(&s); Traverse_SequenStack(&s); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值