栈和队列(不定时更新)



栈的创建,入栈,打印栈内数据
#include <stdio.h> #include <stdlib.h> typedef int StackElementType; typedef struct node { StackElementType data; struct node *next; }LinkStackNode; typedef LinkStackNode *LinkStack; void InitStack(LinkStack *s) { *s = (LinkStack)malloc(sizeof(LinkStackNode)); LinkStack s1 = *s; s1->data = -1; s1->next = NULL; } void push(LinkStack *s) { int x; LinkStack s1; LinkStack s2 = *s; if(s2->next == NULL) { s1 = (LinkStackNode *)malloc(sizeof(LinkStackNode)); scanf("%d", &x); if(x == -1) { free(s1); return; } s1->data = x; s1->next = NULL; s2->next = s1; } while(1) { s1 = (LinkStackNode *)malloc(sizeof(LinkStackNode)); scanf("%d", &x); if(x == -1) { free(s1); return; } s1->data = x; s1->next = s2->next; s2->next = s1; } } void print(LinkStack *s) { LinkStack s1 = *s; s1 = s1->next; while(s1 != NULL) { printf("%d ", s1->data); s1 = s1->next; } } int main() { LinkStack s; InitStack(&s); push(&s); print(&s); }

 

//创建队列并且进行初始化
#include <stdio.h> #include <stdlib.h> typedef int QueueElementType; typedef struct Node { QueueElementType data; struct Node *next; }LinkQueueNode; typedef struct { LinkQueueNode *front; LinkQueueNode *rear; }LinkQueue; int initQueue(LinkQueue *q) { int x; LinkQueue *q2 = q; LinkQueueNode *q3; LinkQueueNode * q1 = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); scanf("%d", &x); if(x == -1) { (q)->front = NULL; (q)->rear = NULL; } q1->data = x; q1->next = NULL; q2->front = q1; q2->rear = q1; while(1) { scanf("%d", &x); if(x == -1) return; q3 = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); q3->data = x; q1->next = q3; q1 = q1->next; q3->next = NULL; (q)->rear = q3; printf("aaaa "); } } void print(LinkQueue *q) { LinkQueueNode *q1 = q->front; for(; q1 != NULL; q1 = q1->next) { printf("%d", q1->data); } return ; } int main() { LinkQueue q; initQueue(&q); // enterQueue(&q); print(&q); }

栈区(stack区):由编译器创建和释放,存放函数的参数值,局部变量值,起操作方式类似于数据结构中的栈。

堆区(heap):由程序员创建和释放,若程序员不释放,则由操作系统收回。

全局区:全局变量和静态变量是存储在一起的。

 

栈:只要剩余栈的空间大于申请栈的空间,系统则为程序提供内存,否则,将报异常栈溢出。

堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序申请时,会遍历该链表,寻找第一个空间大于所申请的堆节点,然后将该节点从堆节点中删除,并将该节点分配给程序,大多数操作系统会在这块内存空间的首地址记录本次分配的大小,这样代码的delete 语句才能正确的释放本内存空间。

 

posted @ 2014-03-11 17:07  elroyzhang  阅读(215)  评论(0编辑  收藏  举报