C语言—栈

栈的操作:进栈和出栈

 1 #include "stdafx.h"
 2 #include "stack.h"
 3 #define maxsize  20
 4 typedef int Elemtype;
 5
 6 /*顺序存储—数组形式*/
 7 struct stack
 8 {
 9     int data[maxsize];
10     int top;
11 };
12
13 void init(struct stack *ps)
14 {
15     ps->top = -1;
16 }
17
18 void init2(struct Doublestack * ps)
19 {
20     ps->top1 = -1;
21     ps->top2 =maxsize;
22 }
23
24 void  print(int a[],int len)
25 {
26     int i;
27     // len = sizeof(a) / sizeof(a[0]);这样子你得不到长度的,此时a退化为了指针
28     for (i = 0; i <= len - 1; i++)
29     {
30         printf("%d\n", a[i]);
31     }
32 }
33 int push(struct stack * s, int e)
34 {
35     if (s->top == maxsize - 1)
36         return -1;
37     s->data[++s->top] = e;
38     return 0;
39 }
40
41 Elemtype  pop(struct stack *s)
42 {
43     int n;
44     if (s->top == 0)
45         return -1;
46     n = s->data[s->top--];
47
48     return n;
49 }
50
51 //两栈共享
52 struct Doublestack
53 {
54     int data[maxsize];
55     int top1;
56     int top2;
57 };
58
59 int push_two(struct Doublestack *s, int e, int stackflag)
60 {
61     if (s->top1 == s->top2 - 1)  //full stack
62         return -1;
63     if (stackflag == 1)
64     {
65         s->data[++s->top1] = e;
66     }
67     else if (stackflag == 2)
68     {
69         s->data[--s->top2] = e;
70     }
71     return 0;
72 }
73 Elemtype pop_two(struct Doublestack *s,  int stackflag)
74 {
75     int n;
76     if (stackflag == 1)
77     {
78         if (s->top1 == -1)  //s1 empty
79             return -1;
80         n = s->data[s->top1--];
81     }
82     else if (stackflag == 2)
83     {
84         if (s->top2 ==maxsize)  //s2 empty
85             return -1;
86         n = s->data[s->top2++];
87     }
88     //printf("%d\n", n);
89     return n;
90 }

主函数

 1 #include "stdafx.h"
 2 #include  "link.h"
 3 #include "stack.h"
 4
 5 int main()
 6 {
 7
 8     /*stack_test*/
 9     //struct stack s;
10     //struct stack *ps = &s;
11     //init(ps);
12
13     struct Doublestack s;
14     struct Doublestack * ps = &s;
15     init2(ps);
16     int e = 1;
17     int n;
18     //push( ps,  e);
19     //push(ps, 2);
20     //print(ps->data,2);
21     //n = pop(ps);
22     //printf("%d\n", n);
23
24     push_two(ps, e,1);
25     push_two(ps, 2, 2);
26     print(ps->data, 20);
27      n=pop_two(ps,1);
28     printf("n =%d\n", n);
29
30     system("pause");
31
32
33 }

原文地址:https://www.cnblogs.com/liuhaier/p/10605727.html

时间: 2024-08-02 09:56:24

C语言—栈的相关文章

C语言栈队列实现二-十/二-八进制转换

C语言栈队列实现二-十/二-八进制转换 2015-04-05 Lover雪儿 1 //利用栈来求取二进制数的十进制与八进制的结果 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 6 #define STACK_INIT_SIZE 20 //初始栈大小 7 #define STACK_INCREMENT 10 //扩充栈时每次增加的内存 8 9 typedef char ElemType;

C语言栈调用机制初探

学习linux离不开c语言,也离不开汇编,二者之间的相互调用在源代码中几乎随处可见.所以必须清楚地理解c语言背后的汇编结果才能更好地读懂linux中相关的代码.否则会有很多疑惑,比如在head.s中会看到调用main函数,在调用之前会看到几次压栈行为,在<linux内核完全注释>一书中会看到这几句汇编后面的注释说是为main函数的参数进行压栈,可是查看main的代码发现main函数根本不需要任何参数,这里为什么会有几次压入参数的动作呢?再比如fork函数中会看到有众多参数,但在调用这时却没有看

【数据结构】C语言栈的基本操作

#include<stdio.h> #include<stdlib.h> #include<malloc.h> //定义节点 struct Node { int data; struct Node *next; }; typedef Node StackNode; //定义栈 struct Stack { StackNode *top; StackNode *base; }; typedef Stack SqStack; //定义创建栈的函数 int InitStack

c语言栈的链表实现

#include <stdio.h> #include <stdlib.h> #include"PublicDS.h" typedef int ElemType; //定义栈节点的结构 typedef struct StackNode{ ElemType data; struct StackNode* next; }StackNode; //定义栈的结构 typedef struct Stack{ StackNode* top; int count; }Stac

C语言栈的实现

static.h #define STATIC_INIT_SIZE 100#define STATICINCREMENT 10#define ERROR 0#define OK 1typedef struct { int *base;//定义栈底 int *top;//定义栈顶元素 int staticsize; }SqStatic; typedef int Status; //初始化一个空栈Status InitStatic(SqStatic *S); //销毁栈Status DestroyS

C语言 栈的初始化,入栈,出栈,判断栈是否为空,清空栈等函数

#include <stdio.h>#include <stdlib.h> typedef struct Node{ int data ; struct Node * pNext;}*PNODE ,NODE ; typedef struct stack{ PNODE pTop; PNODE pBottom;}*PSTACK ,STACK;void init(PSTACK pS);void push(PSTACK pS,int val);void show(PSTACK pS);bo

Rust这个新的语言

Rust初步(七):格式化 摘要: 在Rust中,如果要进行屏幕输出,或者写入到文件中,需要对数据进行格式化.这一篇总结一下它所支持的几种格式化方式. 这篇文章参考了以下官方文档,不过,按照我的风格,我还是会突出于C#语言的比较,这样可能更好懂一些. http://rustbyexample.com/hello/print.html http://doc.rust-lang.org/std/fmt/ http://rustbyexa...阅读全文 posted @ 2015-08-27 13:0

JVM的本地方法栈

对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区.当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界.本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情. 本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法. 任何本地方法接口都会使用某种本地方法栈.当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈.然而当它调用的是本地方法时,虚

【干货】微服务技术栈选型手册2.0

一.前言 2014年可以认为是微服务1.0的元年,当年有几个标志性事件,一是Martin Fowler在其博客上发表了"Microservices"一文,正式提出微服务架构风格:二是Netflix微服务架构经过多年大规模生产验证,最终抽象落地形成一整套开源的微服务基础组件,统称NetflixOSS,Netflix的成功经验开始被业界认可并推崇:三是Pivotal将NetflixOSS开源微服务组件集成到其Spring体系,推出Spring Cloud微服务开发技术栈. 一晃三四年过去,