| Init(&stack) | 初始化 |
| Clear(&stack) | 清空 |
| Destroy(&stack) | 销毁 |
| isEmpty(&stack) | 是否为空 |
| Length(&stack) | 栈长度 |
| Push(&stack, data) | 入栈 |
| Pop(&stack, &data) | 出栈 |
| Top(&stack, &el) | 取栈顶 |
| Display(&stack) | 遍历 |
//使用动态数组
typedef struct Stack{
Elemtype *top;
Elemtype *base;
int size;
}Stack;
//使用静态数组的实现,请参考[3. 顺序栈的参考代码]
void Init(Stack *s)
{
s->base = (Elemtype *)malloc(sizeof(Elemtype) * MaxSize);
if (!s->base)
exit(0);
s->top = s->base;
s->size = MaxSize;
}
Status Push(Stack *s, Elemtype data)
{
// Stack Full
if (s->top - s->base >= s->size)
exit(0);
*(s->top) = data;
s->top++;
return OK;
}
Status Pop(Stack *s, Elemtype *data)
{
// Stack Empty
if (s->top == s->base)
return ERROR;
//*e = *--(s->top);
s->top--;
*data = *(s->top);
return OK;
}
Status Top(Stack *s, Elemtype *data)
{
if (s->top > s->base)
{
*data = *(s->top - 1);
return OK;
}
return ERROR;
}
Status Length(Stack *s)
{
return s->top - s->base;
}
Status IsEmpty(Stack *s)
{
return (s->base == s->top) ? OK : ERROR;
}
void Clear(Stack *s)
{
s->top = s->base;
}
void Destroy(Stack *s)
{
if (s != NULL)
{
free(s->base);
s->top = s->base = NULL;
s->size = 0;
}
}
void Display(Stack *s)
{
int i = 0;
int len=Length(s);
int *p=s->base;
if (!len)
return;
while (i < len)
{
printf("%d->", *p);
i++;
p++;
}
printf("NULL\n");
}
//动态数组
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define MaxSize 10
typedef int Status;
typedef int Elemtype;
typedef struct Stack
{
Elemtype *top;
Elemtype *base;
int size;
} Stack;
void Init(Stack *s)
{
s->base = (Elemtype *)malloc(sizeof(Elemtype) * MaxSize);
if (!s->base)
exit(0);
s->top = s->base;
printf("%p\n",s->base);
s->size = MaxSize;
}
Status Push(Stack *s, Elemtype data)
{
// Stack Full
if (s->top - s->base >= s->size)
exit(0);
*(s->top) = data;
s->top++;
return OK;
}
Status Pop(Stack *s, Elemtype *data)
{
// Stack Empty
if (s->top == s->base)
return ERROR;
//*e = *--(s->top);
s->top--;
*data = *(s->top);
return OK;
}
Status Top(Stack *s, Elemtype *data)
{
if (s->top > s->base)
{
*data = *(s->top - 1);
return OK;
}
return ERROR;
}
Status Length(Stack *s)
{
return s->top - s->base;
}
Status IsEmpty(Stack *s)
{
return (s->base == s->top) ? OK : ERROR;
}
void Clear(Stack *s)
{
s->top = s->base;
}
void Destroy(Stack *s)
{
if (s != NULL)
{
free(s->base);
s->top = s->base = NULL;
s->size = 0;
}
}
void Display(Stack *s)
{
int i = 0;
int len = Length(s);
int *p = s->base;
if (!len)
return;
while (i < len)
{
printf("%d->", *p);
i++;
p++;
}
printf("NULL\n");
}
void DisplayAdv(Stack s, void (*visit)(Elemtype))
{
while (IsEmpty(&s))
{
visit(*s.base++);
}
}
void Dec2bin(Stack *s, int num)
{
int i,temp,res,len;
while (num > 0)
{
temp = num % 2;
num = (int)num / 2;
Push(s, temp);
}
len=Length(s);
// WHY NOT???
// for ( i = 0; i < Length(s); i++)
for ( i = 0; i < len; i++)
{
Pop(s,&res);
printf("%d",res);
}
}
int main()
{
int i, value, length;
Elemtype e;
Stack *s;
printf("%p\n",s->base);
Init(s);
printf("%p\n",s->base);
for (i = 0; i < 10; i++)
Push(s, i);
length = Length(s);
printf("data in stack:\n");
Display(s);
IsEmpty(s);
length = Length(s);
Pop(s, &e);
Top(s, &e);
printf("Top is %d, length is %d\n", e, Length(s));
Clear(s);
length = Length(s);
// decimal to binary
printf("decimal to binary---------------\n");
printf("please input a number->");
scanf("%d",&value);
Dec2bin(s, value);
Destroy(s);
return 0;
}
//静态数组
#include <stdio.h>
#include <stdlib.h>
#define maxSize 10
#define TRUE 1
#define FALSE 0
typedef struct Stack
{
int data[maxSize];
int top;
} Stack;
Stack *Init();
int IsEmpty(Stack *s);
int Push(Stack *s, int data);
int Pop(Stack *s, int *data);
int Top(Stack *s, int *data);
void Clear(Stack *s);
void Show(Stack *s);
void Dec2bin(Stack *s, int num);
int main(void)
{
int res;
Stack *s = Init();
printf("please input a number->");
scanf("%d", &res);
printf("Decimal number: \t%d\n", res);
printf("Binary number: \t\t");
Dec2bin(s, res);
return 0;
}
Stack *Init()
{
Stack *s = (Stack *)malloc(sizeof(Stack));
s->top = -1;
printf("Init done\n");
return s;
}
int IsEmpty(Stack *s)
{
return (s->top == -1) ? TRUE : FALSE;
}
int Push(Stack *s, int data)
{
if (s->top == maxSize - 1)
{
printf("Stack Full\n");
return FALSE;
}
s->data[s->top] = data;
s->top++;
return TRUE;
}
int Pop(Stack *s, int *data)
{
if (s->top == -1)
{
printf("Stack Empty\n");
return FALSE;
}
s->top--;
*data = s->data[s->top];
return TRUE;
}
int Top(Stack *s, int *el)
{
if (s->top == -1)
{
printf("Stack Empty\n");
return FALSE;
}
*el = s->data[s->top - 1];
printf("Stack top done\n");
return TRUE;
}
void Clear(Stack *s)
{
s->top = -1;
}
void Show(Stack *s)
{
int res;
while (s->top > -1)
{
Pop(s, &res);
printf("%d", res);
}
printf("\n");
}
void Dec2bin(Stack *s, int num)
{
int rem;
char *str;
while (num > 0)
{
rem = num % 2;
num = (int)num / 2;
Push(s, rem);
}
Show(s);
}
//不带头节点的链栈
typedef struct Node
{
int data;
struct Node *next;
} Node, Stack;
//带头节点的链栈
typedef struct Node
{
int data;
struct Node *next;
} Node;
typedef struct Stack
{
Node *top;
int count;
} Stack;
//不带头节点的链栈
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
} Node, Stack;
Stack *Init()
{
Node *s = NULL;
printf("%p\n", s);
return s;
}
Stack *Push(Stack *s, int data)
{
Node *node = (Node *)malloc(sizeof(Node));
node->next = s;
node->data = data;
return node;
}
void pop(Stack *s, int *data)
{
if (!s)
return;
*data = s->data;
Node *node = s;
s = s->next;
free(node);
}
int top(Stack *s)
{
return s ? s->data : -1;
}
Stack *Clear(Stack *s){
Node *node=s;
Node *tmp;
while (node)
{
tmp=node;
node=node->next;
free(tmp);
}
return node;
}
void Traverse(Stack *s)
{
int res;
Node *p =s;
while (p)
{
res=p->data;
printf("%d->", res);
p=p->next;
}
printf("NULL\n");
}
// 10 -> 2
void Dec2bin(Stack *s, int num)
{
int rem;
while (num > 0)
{
rem = num % 2;
s=Push(s, rem);
num = (int)num / 2;
}
Traverse(s);
}
int main(void)
{
Stack *s;
printf("%p\n", s);
s = Init();
printf("%p\n", s);
s=Push(s,1);
s=Push(s, 11);
s=Push(s, 2);
s=Push(s, 3);
s=Push(s, 10);
Traverse(s);
s = Clear(s);
Dec2bin(s, 5);
s = Clear(s);
return 0;
}
//带头节点的链栈
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
} Node;
typedef struct Stack
{
Node *top;
int count;
} Stack;
// 初始化栈就是创建一个结构体变量
Stack *Init()
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->top = NULL;
stack->count = 0;
printf("Stack Init done\n");
return stack;
}
// 链表的头插法
void Push(Stack *s, int data)
{
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = s->top;
s->top = node;
s->count++;
}
void Pop(Stack *s, int *res)
{
if (!s->top)
return;
Node *node = s->top;
s->top = node->next;
s->count--;
*res = node->data;
free(node);
}
int Top(Stack *s, int *res)
{
if (s->top){
*res = s->top->data;
return 0;
}
return -1;
}
void Traverse(Stack *s)
{
Node *node = s->top;
while (node)
{
printf("%d->", node->data);
node = node->next;
}
printf("Null\n");
}
int isEmpty(Stack *s)
{
return s->count ? 1 : 0;
}
void Clear(Stack *s){
Node *node;
while (s->top)
{
node=s->top;
s->top=node->next;
free(node);
}
s->count=0;
}
void Dec2bin(Stack *s, int num)
{
int rem;
while (num > 0)
{
rem = num % 2;
Push(s, rem);
num = (int)num / 2;
}
Traverse(s);
}
int main(void)
{
int res;
Stack *s = Init();
Dec2bin(s, 9);
Clear(s);
isEmpty(s);
Push(s, 1);
Push(s, 11);
Push(s, 2);
Push(s, 3);
Push(s, 10);
Traverse(s);
Pop(s, &res);
Pop(s, &res);
Traverse(s);
Pop(s, &res);
Traverse(s);
Top(s, &res);
Pop(s, &res);
Top(s, &res);
Pop(s, &res);
Top(s, &res);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define maxSize 10
#define TRUE 1
#define FALSE 0
typedef struct
{
int data[maxSize];
int rear;
int front;
} Queue;
//地址的地址
void initBak(Queue **q)
{
*q = (Queue *)malloc(sizeof(Queue));
(*q)->front = 0;
(*q)->rear = 0;
printf("init inside\t%p\n", *q);
}
//返回申请的地址
Queue *init()
{
Queue *q = (Queue *)malloc(sizeof(Queue));
q->front = 0;
q->rear = 0;
printf("inside size of Queue\t%p\n", q);
printf("inside size of Queue\t%ld\n", sizeof(*q));
return q;
}
int isEmpty(Queue *q)
{
return q->rear == q->front;
}
//先加再入
int enQueue(Queue *q, int data)
{
if ((q->rear + 1) % maxSize == q->front)
{
printf("Queue full\n");
return FALSE;
}
//先赋值再移动
q->data[q->rear] = data;
q->rear = (q->rear + 1) % maxSize;
printf("data %d enQueue OK\n",data);
return TRUE;
}
void deQueue(Queue *q,int *res)
{
if (q->rear == q->front)
{
printf("Queue empty\n");
return;
}
//先获取再移动
*res=q->data[q->front];
q->front = (q->front + 1) % maxSize;
printf("%d deQueue OK\n",*res);
return;
}
int length(Queue *q){
return (q->rear-q->front) % maxSize;
}
//homework start--------------------------------------------------
void display(Queue *q){
int len=length(q);
int ind=q->front;
printf("Queue->");
while(ind!=q->rear)
{
printf("%d->",q->data[ind]);
ind++;
}
printf("NULL\n");
}
//homework end----------------------------------------------------
void destroy(Queue *q)
{
free(q);
}
void baoshu(Queue *sq, int n)
{
int i, count = 1, e;
//init(sq);
for (i = 1; i <= n; i++)
enQueue(sq, i);
printf("排列后队列:");
while (!isEmpty(sq))
{
deQueue(sq, &e);
if (count % 2 == 1)
printf("%d ", e);
else
enQueue(sq, e);
count++;
}
printf("\n");
}
int main(void)
{
int i,res,len;
Queue *q;
printf("oustside\t%p\n", q);
printf("outside size of Queue\t%ld\n", sizeof(*q));
q=init();
printf("outside init done\t%p\n", q);
printf("outside size of Queue\t%ld\n", sizeof(*q));
display(q);
enQueue(q,10);
enQueue(q,20);
enQueue(q,30);
printf("length of Queue %d\n",length(q));
enQueue(q,40);
enQueue(q,50);
printf("length of Queue %d\n",length(q));
enQueue(q,60);
enQueue(q,70);
enQueue(q,80);
enQueue(q,90);
printf("\n");
display(q);
deQueue(q,&res);
printf("length of Queue %d\n",length(q));
deQueue(q,&res);
deQueue(q,&res);
display(q);
printf("length of Queue %d\n",length(q));
deQueue(q,&res);
deQueue(q,&res);
deQueue(q,&res);
display(q);
deQueue(q,&res);
deQueue(q,&res);
deQueue(q,&res);
deQueue(q,&res);
display(q);
free(q);
printf("free\t\t%p\n", q);
baoshu(q,5);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct Node
{
int data;
struct Node *next;
} Node;
typedef struct
{
Node *front;
Node *rear;
int len;
} Queue;
//地址的地址
void initBak(Queue **q)
{
*q = (Queue *)malloc(sizeof(Queue));
(*q)->front = NULL;
(*q)->rear = NULL;
(*q)->len = 0;
}
//返回申请的地址
Queue *init()
{
Queue *q = (Queue *)malloc(sizeof(Queue));
q->front = NULL;
q->rear = NULL;
q->len = 0;
return q;
}
//没有队满的限制
void enqueue(Queue *q, int el)
{
Node *node = (Node *)malloc(sizeof(Node));
node->data = el;
node->next = NULL;
// 判断是否为空
if (!q->len)
{
q->front = node;
q->rear = node;
}
else
{
q->rear->next = node;
q->rear = node;
}
q->len++;
printf("enqueue OK\n");
}
//要判断队是否为空;且删除节点时,不要忘记回收节点;
int dequeue(Queue *q)
{
if (!q->len)
{
printf("Queue empty\n");
return FALSE;
}
Node *node=q->front;
int res = q->front->data;
q->front = q->front->next;
free(node);
q->len--;
printf("dequeue OK\n");
return res;
}
void Top(Queue *q,int *res){
if(!q->len){
return;
}
*res=q->front->data;
}
void destroy(Queue **q)
{
free(*q);
}
int isEmpty(Queue *q)
{
//OK
//return q->len==0;
return q->len?0:1;
}
int len(Queue *q){
return q->len;
}
//如果根据表长len来遍历呢
void display(Queue *q){
Node *p=q->front;
printf("Queue->");
while(p){
printf("%d->",p->data);
p=p->next;
}
printf("NULL\n");
}
int main(void)
{
Queue *q=init();
display(q);
int len = 8, res, i;
for (i = 1; i <= len; i++)
{
enqueue(q, i);
}
display(q);
dequeue(q);
display(q);
dequeue(q);
dequeue(q);
display(q);
dequeue(q);
dequeue(q);
dequeue(q);
dequeue(q);
display(q);
dequeue(q);
display(q);
dequeue(q);
display(q);
return 0;
}
// n的阶乘
function fac(n) {
if (n == 0) {
return 1
} else {
return n * fac(n - 1)
}
}
// a和b的最大公约数
function gcd(a, b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b)
}
}
// n阶台阶的走法:可以一次走1阶;也可以一次走2阶,共多少种走法?
function steps(n) {
switch (n) {
case 1: return 1;
case 2: return 2;
default: return steps(n - 1) + steps(n - 2)
}
}
void dec2bin(Stack *s, int num)
{
int rem;
while (num > 0)
{
rem = num % 2;
push(s, rem);
num = (int)num / 2;
}
show(s);
}
void symStr(Stack *s, char *str)
{
while (*str != '\0')
{
push(s, *str);
str++;
}
traversal(s);
}


