hhh,作者太懒了,本来决定每周更好像没有做到。把所有栈有关的代码都栈在这个贴子了。之后也不会像以前一样分的那么细了。
总而言之,栈有两种实现方式-顺序栈和链栈。栈先进先出,其栈顶和栈底的概念是我们必须要理解的。栈的共享技术也非常有意思。
#include<stdio.h>
#include<stdlib.h>
//LIFO-后进先出,Top栈顶;Bottem栈底
//ADT stack{
// 数据元素:必须是属于同一个数据对象
// 结构关系:栈中地数据元素之间是线性关系
// 基本操作:InitStack(S);ClearStack(S);IsEmpty(S);IsFull(S);Push(S, x);Pop(S, x); GetTop(S, x);
//}ADT stack;
//顺序栈-需要top栈顶指针动态指示栈顶元素位置(top=-1表示空栈)
#define Stack_Size 50
#define StackElementType char
#define TRUE 1
#define FALSE 0
typedef struct{
StackElementType elem[Stack_Size];
int top;
}SeqStack;
//初始化顺序栈-构造一个空栈
void InitStack(SeqStack *S)
{
S->top = -1;
}
//把x置入新栈栈顶
int Push(SeqStack *S, StackElementType x)
{
if(S->top == Stack_Size - 1) return (FALSE);//栈已满
else{
S->top++;
S->elemm[S->top] = x;
return (TRUE);
}
}
//弹出栈顶元素并保存
int Pop(SeqStack *s, StackElementType *x)
{
if(S->top == -1) return (FALSE);//栈空
else{
*x = S->elem[S->top];
S->top--;
return (TRUE);
}
}
//读栈顶元素,与pop比S->top不用改
int GetTop(SeqStack *S, StackElementType *x)
{
if(S->top == -1) return (FALSE);//栈空
else{
*x = S->elem[S->top];
// S->top--;
return (TRUE);
}
}
#include<stdio.h>
#include<stdlib.h>
#define M 100
//多栈共享技术-双端栈(栈底位置不变,而栈顶位置动态变化)
#define ElementType int
#define FLASE 0
#define TRUE 1
typdef struct{
StackElementType Stack[M];
int top[2]; //
}DqStack;
//双端顺序栈初始化
void InitStack(DqStack *S)
{
S->top[0] = -1;
S->top[1] = M;
}
//进栈操作(左边0号栈,右边1号栈)
int Push(DqStack *s, StackElementType x, int i)
{
if(S->top[0] + 1 == S->top[1]) return (FALSE);//双端栈已满
switch(i){
case 0:{
S->top[0]++;
S->StackElementType[S->top[0]] = x;
break;
}
case 1:{
S->top[1]--;
S->StackElementType[S->top[1]] = x;
break;
}
default: return (FALSE);
}
return (TRUE);
}
int main()
{
return 0;
}
#include<stdio.h>
#include<stdlib.h>
//队列Queue-FIFO-先进显出;允许插入的一端叫队尾Rear,允许删除的一端叫队头Front
//队列的基本操作:InitQueue(Q), IsEmpty(Q), IsFull(Q),
//EnterQueue(Q,x), DeleteQueue(Q, x), GetHead(Q, x), ClearQueue(Q)
//下面来实现链队列
typedef struct Node{
QueueElementType data;
struct Node *next;
}LinkQueueNode;
typedef struct{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;
//链队列初始化
int InitQueue(LinkQueue *Q)
{
Q->front = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL){
Q->rear = Q->front;
Q->front->next = NULL;
return (TRUE);
}
else return (FALSE);
}
//链队列入队操作算法-从队尾入队
int EnterQueue(LinkQueue *Q, QueueElementType x)
{
LinkQueueNOde *NewNode;
NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(NewNode!=NULL)
{
NewNode->data = x;
NewNode->next = NULL;
Q->rear->next = NewNode;
Q->rear = NewNode;
return (TRUE);
}
else return (FALSE);
}
//链队列出队-队头元素出队
int DeleteQueue(LinkQueue *Q, QueueElementType *x)
{
LinkQueueNode *p;
if(Q->front == Q->rear) return (FALSE); //空队
p = Q->front->next;
Q->front->next = p->next; //队头元素p出队
if(Q->rear == p) //如果队中只有一个元素p,p出队后为空队
Q->rear = Q->front;
*x = p->data;
free(p);
return (TRUE);
}
int main()
{
return 0;
}