栈
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct
{ int *base;
int *top;
int stacksize;
}stack;
//构造一个空栈
int initStack(stack *s)
{
s->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(s->base == NULL)
{
printf("存储空间分配失败!");
exit(-1);
}
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
return 1;
}
//入栈的方法,x为需要压入栈顶的元素
int push(stack *s,int x)
{
//判断栈容量是否已经满了,如果已满,重新分配存储空间
if(s->top - s->base >= s->stacksize)
{
s->base = (int *)realloc(s->base,(s->stacksize + STACKINCREMENT)*sizeof(int));
}
if(s->base == NULL)
{
printf("内存分配失败!");
exit(-1);
}
*s->top++ = x; //把元素压栈
return 1;
}
//出栈的方法
int pop(stack *s)
{
if(s->base == s->top)
return -1;
//默认压入栈中的元素都是正整数,所以返回-1表示栈空
//如果栈不空,则删除栈顶元素并返回其值
return *--s->top;
}
//获取栈顶元素
int gettop(sqstack S,ElemType *e)
{
if ( S.top==0 ) // 栈空
{ printf("Stack is empty!\n");
return -1;
}
*e= S.base[top-1];
return 0;
}
队列
#include<stdio.h>
#include<stdlib.h>
#define maxlen 103
//循环队列
typedef struct
{
int data[maxlen];
int front, rear;
}SeqQueue;
SeqQueue Q;
//置空队!!!!
void InitQueue(SeqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
}
//判队空
int QueueEmpty(SeqQueue *Q)
{
if(Q->front == Q->rear)
return 1;
else return 0; //队空时返回1,不空返回0
}
//判队满
int QueueFull(SeqQueue *Q)
{
if(Q->front == (Q->rear + 1)%maxlen) return 1;
else return 0; //队满时返回1,不满返回0
}
//取队头元素,首先要判断队是否空,然后才能求解。
int GetHead(SeqQueue *Q)
{
int x;
if(QueueEmpty(Q)) {printf("error!"); return 0;}
else
{
x = Q->data[(Q->front+1)%maxlen];
return x;
}
}
//入队,入队前,要判断队是否满
int Add(SeqQueue *Q,int x)
{
if(!QueueFull(Q)){ //若队不满,则进行入队运算
Q->rear = (Q->rear + 1)%maxlen;
Q->data[Q->rear] = x;
return 1;
}
else return 0;
}
//出队,出队前,判断队是否空。,返回出队元素
int Delete(SeqQueue *Q, int *px)
{
if(QueueEmpty(Q)) return 0;
//若队不空,则进行出队运算
else
{
Q->front = (Q->front + 1)% maxlen;
*px = Q->data[Q->front];
return 1;
}
}
//循环队列的长度
int length_seqQueue(SeqQueue *Q)
{
//判断队列是否为空
if(QueueEmpty(Q))
return 0;
else
return ((Q->rear-Q->front+maxlen)%maxlen);
}