栈的创建和应用

来源:互联网 发布:法国航空发动机知乎 编辑:程序博客网 时间:2024/06/18 18:07
/*
栈的基本操作函数
CreateStack()
IsFull()
Push()
IsEmpty()
Pop()
栈的特点:先进后出(LIFO),表尾即栈顶,仅在表尾进行插入或删除的线性表
*/

顺序栈(即地址连续的存储单元)

#define StackIncrease 20
typedef struct{
ElemType *base;
ElemType *top;
int StackSize;//当前可用最大容量
}SStack; //顺序栈
int CreateStack(SStack &Stack,int Stack_Init_Size)
{
Stack.base = (ElemType *)malloc(Stack_Init_Size * sizeof(ElemType));
if (!Stack.base) exit(1); //内存分配失败返回NULL
Stack.top  = Stack.base;
Stack.StackSize = Stack_Init_Size;
return 0
}
void Push(ElemType &elem,SStack Stack)
{
if (Stack.top - Stack.base >= Stack.StackSize)//栈满标志
{
Stack.base = (ElemType *)realloc(Stack.base,(Stack.StackSize + StackIncrease) * sizeof(ElemType))
if(!Stack.base) exit(1);//存储分配失败
Stack.top = Stack.base + StackSize;
StackSize += StackIncrease;
}
*Stack.top++ = elem;//一元运算符++和*的优先级相同,运算时自右向左进行计算
return;
}
void Pop(ElemType &elem,SStack Stack)
{
if(Stack.top == Stack.base)//栈顶指针和栈底指针指向相同,可作为栈空的标记
return 1;

elem = * --Stack.top;//先运算--操作,再*操作取值

return;

}

//********************************************************************************
//链式栈的创建(特殊的单链表)
//栈的结点仍然是包含一个数据域一个链接域
//定义链式栈结构体类型

链式栈

typedef struct PolyNode{

int data;

struct PolyNode *next;

}StackNode;

//创建栈顶指针

StackNode *top= (StackNode *)malloc(sizeof(StackNode)) ;

if(!top)

exit(1);

top->next = NULL;

//Push操作

StackNode* Push(int data)//返回栈顶指针,

{

StackNode *NewNode;//创建新结点

NewNode = (StackNode *)malloc(sizeof(StackNode)) ;

if(!NewNode) exit(1);

top->data = data;

NewNode->next = top;

top = NewNode;//最新的栈顶指针

return top;

}

int Pop()

{

StackNode *ptr = top;

top = top->next;

free(ptr);//释放先前栈顶指针的内存空间

}

中缀表达式转换为后缀表达式 然后进行堆栈操作

转换:2*(9+6/3-5)+4
1.运算数直接输出
2.左括号压入堆栈
3.右括号:将栈顶的运算符弹出并输出,知道遇到左括号(出栈但不输出)
4.运算符:(括号里面的优先级大于括号)
4.1 若优先级大于栈顶运算符时,则把它压栈;
4.2 若优先级小于栈顶运算符时,将栈顶运算符弹出并输出,再比较新的栈顶运算符,
直到该运算股大于栈顶运算符的优先级为止,然后将该运算符压栈;
输出: 压栈:
2
*
* (
2 9
* ( +
2 9 6 
* ( + / 
2 9 6 3 
* -
2 9 6 3 / + 
2 9 6 3 / + -  
2 9 6 3 / + - 5
2 9 6 3 / + - 5 * +

转换结果:2963/+5-*4+


0 0