栈算法
1. 用栈进行表达式求值(c++)(符合的话我会追加分数的,越快越好!)
要对表达式就行遍历,分为前序遍历、中序遍历和后序遍历
举一个例子说明 《停车场管理》
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include "stdio.h"
#include "malloc.h"
#define max_stop 5 // 停车场容量//
#define PRICE 8 //停车单价 //
typedef struct//汽车//
{ char *license[20]; //汽车//
}car;
typedef struct //停车场//
{ car stop[max_stop]; //停车场//
int top;
}parking;
void come(car p,parking *tcc)
{
if(tcc->top>=max_stop-1){printf("已满!!");}
else
{
printf(" 输入到来汽车的车牌号码 : ");
scanf("%s",p.license);
printf("\n");
tcc->top++; tcc->stop[tcc->top]=p;//如果停车场没有满就入场//
}
}
void display(car p,parking *tcc)
{
int n=0;
if(tcc->top==-1)printf(" 停车场内无汽车!\n"); //指针在-1处 停车场内无车//
else{ // 有车 //
printf("●停车场内的车为:\n");
while(n<=tcc->top)
{
printf("第 %d 辆 %s\n",n+1,tcc->stop[n].license);
n++;
}
}
}
void leave(car p,parking *tcc)
{
car leavecar;
int num,money,time;
printf(" 输入将要离开的汽车车位号码:");
scanf("%d",&num);
num--;
if(num>tcc->top||num<0)printf(" 你的输入有误 请检查预备出停车场的车辆号码\n");
else
{
printf(" 输入此车停留的时间 : ");
scanf("%d",&time);
if(time<=0)printf(" 你的输入有误 请检查停车时间\n");
else
{
leavecar=tcc->stop[num];
while(num<tcc->top)
{
tcc->stop[num]=tcc->stop[num+1];
num++;
}
tcc->top--;
}
}
if((num<=tcc->top) && (num>=0))
{
money=time*PRICE;
printf("● %s 已经离开停车场 停留%d小时 收费%d元",leavecar.license,time,money);
}
}
void welcome() //欢迎界面//
{
printf(" ●欢迎适用本程序●\n");
printf(" 本程序为停车场的模拟管理程序,有车到来时请按 C 键\n");
printf(" 然后根据屏幕提示进行相关操作,有车要走时请按 L 键\n");
printf(" 然后根据屏幕提示进行相关操作,若需要帮助请按 H 键\n");
printf(" 然后根据屏幕提示进行相关操作,要退出程序请按 Q 键\n");
}
void main()
{
char key;
car p;
parking *tcc;
tcc=(parking *)malloc(sizeof(parking));
tcc->top=-1;
while(1)
{
flushall();
printf(" 请输入您的操作 : ");
scanf("%c",&key);
if(key=='c'||key=='C')come(p,tcc);
else if(key=='l'||key=='L')leave(p,tcc);
else if(key=='d'||key=='D')display(p,tcc);
else if(key=='h'||key=='H')welcome();
else if((key=='q')||(key=='Q'))break;
else printf(" 您的输入有误 ! ! 请重新输入:\n");
}
}
3. 在c语言里,参数的压栈和出栈分别是什么意思
压栈是进栈,把元素放到栈里面;出栈,把元素从栈中取出。
栈是先进后出。举个例子,一个装羽毛球的筒子,一边能开一边不能开,1号球先进去,到筒子底部(进栈)。然后2号球接着进去,在你不拿出2号球的情况下,你是无法拿走1号球。而拿走球的操作就是出栈咯
4. 链栈算法
这是我自己做的,能实现的,不过感觉有些繁琐,还没有精简,看着用吧,宏定义有些是不需要的,不过避免出错我全部写上了。
#include "iostream.h"
#include "stdio.h"
#include "malloc.h"
//#include "stdlib.h
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define N 5
#define SElemType int
typedef int Status;
typedef struct SNode{
SElemType data;
struct SNode *next;
}SNode,*StackPtr;
typedef struct {
StackPtr base;
StackPtr top;
}SqStack;
Status InitStack(SqStack&S){
S.base=S.top=(StackPtr)malloc(sizeof(SNode));
if(!S.top)return(OVERFLOW);
S.top->next=NULL;
return OK;
}
Status Push(SqStack &S,SElemType e){
SNode *p;
p=(StackPtr)malloc(sizeof(SNode));
if(!p)return(OVERFLOW);
p->data=e;
p->next=NULL;
S.top->next=p;
S.top=p;
return OK;
}
Status Pop(SqStack &S,SElemType &e){
SNode *p;
if(S.base==S.top)
return ERROR;
p=S.base->next;//注意头结点的运用
e=p->data;
S.base->next=p->next;
if(S.top==p)S.top=S.base;
free(p);
return OK;
}
Status StackEmpty(SqStack S){
if(S.top==S.base)
return TURE;
else
return FALSE;
}
Status StackTraversee(SqStack S){
SNode *p;
p=S.base->next;
while(p<S.top)
{
cout<<p->data<<" ";
p=p->next;
}
while(p==S.top)
{
cout<<S.top->data<<endl;
p->next=NULL;
break;
}
return 0;
}
int main()
{
int i;
SElemType e;
SqStack S;
InitStack(S);
//cin>>s;
cout<<"请输入一个栈:"<<endl;
for(i=1;i<=N;i++)
{
cin>>e;
Push(S,e);
}
cout<<"输入的栈为:"<<endl;
StackTraversee(S);
Pop(S,e);
StackTraversee(S);
StackEmpty(S);
if(TURE)
cout<<"栈空."<<endl;
else if(FALSE)
cout<<"栈不空."<<endl;
return 0;
}