堆栈和队列1:
程序说明:
1 文件夹:利用数组来进行堆栈;
2 文件夹:利用链表来进行堆栈;
3 文件夹:利用数组来进行队列;
4 文件夹:利用链表来进行队列;
1..函数的现场保护等都是堆栈的事情:
利用栈来进行图的深度优先遍历:
2.堆栈和队列的特点:
不同点:
堆栈是先入后出;同一端进出
队列是先出后入;两端进出
依次输入a,b,c,不考虑出栈的清空,队列只有一种,堆栈有五种。
相同点:
都是线性表;
访问都是从端口进行;
队列的上溢现象,假溢出。
其他:
1. fflsh(stdin); 清空缓冲区
2. .h文件中都不放置全局变量的定义等等。
1文件夹
代码:

/*
* wuxiuwen
*20120901
*用数组描述模拟堆栈,利用top来判断堆栈是满来还是到底了。
*/
/***************************/
#include"stack.h"
//#define N 5
int main()
{
//a[-1]=12; 可以访问,但是有可能出错
//printf("%d\n",a[-1]);
int i;
char c;
printf("输入1为入栈,输入2为出栈,输入其他退出\n");
while(1)
{
while(scanf("%d",&i) !=1)
{
printf("输入错误\n");
}
switch(i)
{
case 1:getchar();
// fflush(stdin);
scanf("%c",&c);
push(c);
break;
case 2:c=pop();
printf("%c\n",c);
break;
default: return ;
}
}
return 0;
}
*************************stack.h******************************
#include<stdio.h>
void push(char);
char pop();
*************************stack.c******************************
#include"stack.h"
#define N 5
int top=-1;
char stack[N]="";
void push(char a)
{
if(top>=(N-1))
{
printf("栈满\n");
return ;
}
stack[top+1]=a;
++top;
}
char pop()
{
if(top<0)
{
printf("栈空\n");
return ;
}
top--;
return stack[top+1];
}
*************************执行结果****************************
[root@localhost 1]# gcc main.c stack.c
[root@localhost 1]# ./a.out
输入1为入栈,输入2为出栈,输入其他退出
1
a
1
b
1
c
1
d
1
e
1
f
栈满
2
e
2
d
2
c
2
b
2
a
2
栈空
3
[root@localhost 1]#
/**************************************************************/

/*
* wuxiuwen
*20120901
*用链表描述模拟堆栈
*/
/***************************/
#include"liststack.h"
int main()
{
int i;
char c;
printf("输入1为入栈,输入2为出栈,输入其他退出\n");
while(1)
{
scanf("%d",&i);
switch(i)
{
case 1:getchar();
// fflush(stdin);
scanf("%c",&c);
push(c);
break;
case 2:c=pop();
printf("%c\n",c);
break;
default:
return;
}
}
return 0;
}
**********************liststack.h****************************
#include<stdio.h>
typedef struct node
{
char data;
struct node *next;
}NODE;
void push(char);
char pop();
**********************liststack.c****************************
#include"liststack.h"
#include<stdlib.h>
#define N 5
int n=0;
static NODE *top=NULL;
static NODE *pnew =NULL;
static NODE *stack = NULL;
void push(char a)
{
if(n >= N)
{
printf("stack is full\n");
return ;
}
pnew = (NODE *)malloc(sizeof(NODE));
if(pnew == NULL)
{
printf("内存分配失败\n");
return ;
}
pnew ->data=a;
pnew ->next=NULL;
if(top ==NULL)
top = stack = pnew;
else
pnew->next=top;
top =pnew;
n++;
}
char pop()
{
char temp;
NODE *p=top;
if(top == NULL)
{
printf("栈空\n");
return ;
}
top= top->next;
temp=p->data;
free(p);
n--;
return temp;
}
[root@localhost 2]# ./a.out
输入1为入栈,输入2为出栈,输入其他退出
1
a
1
b
1
c
1
d
1
e
1
f
stack is full
2
e
2
d
2
c
2
b
2
a
2
栈空
2
栈空
3
[root@localhost 2]#