/*本实例需要在labwindows CVI工具下运行*/
#include <ansi_c.h>
#include <cvirte.h>#include <userint.h>
#include "duizhanC.h"
static int panelHandle;
#define MaxStackSize 100
typedef int DataType; //记住不要写成了 #define
typedef struct
{
DataType stack[MaxStackSize];
int top;
} SeqStack;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "duizhanC.uir", PANEL)) < 0)
return -1;
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
void inistack(SeqStack *s)
{
s->top=-1;
}
int empty(SeqStack s)//n判栈空操作
{
if(s.top==-1)
return 1;
else
return 0;
}
int push(SeqStack *s,DataType x)//n入栈
{
if (s->top==MaxStackSize-1) //判断栈满?
{
printf("\nStack is full");
return 0;
}
s->top++; //栈顶下标加1
s->stack[s->top]=x; //入栈
return 1;
}
int pop(SeqStack *s)//n出栈
{
int return_val;
if(s->top==-1) //判断栈空?
{
printf("\n Stack is empty!");
return -1;
}
else
{
return_val= s->stack[s->top]; //元素出栈
(s->top)--; //栈顶下标减1
printf("pop出来的数据是:%d\n",return_val);
return return_val;
}
}
int gettop(SeqStack *s,DataType *d)//n取栈顶元素
{
if(s->top==-1)
{
printf("\nStack is empty!");
return 0;
}
else
{
*d=s->stack[s->top];
return 1;
}
}
// 遍历栈的函数
void TraverseStack(SeqStack *s)
{
int i;
printf("栈的数据为:");
for(i= s->top; i>-1; i--) // 只要栈顶不等于栈底,循环
{
printf("%d ",s->stack[i]); // 打印栈顶的成员member
}
printf("\n");
return ;
}
int CVICALLBACK StartCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int data,num,i,pop_data;
SeqStack s;
switch (event)
{
case EVENT_COMMIT:
inistack(&s);
printf("输入几个数据:");
scanf("%d",&num);
for (i = 0;i < num;i++)
{
printf("第 %d 个数:",i+1);
scanf("%d",&data);
if (push(&s,data)) // 调用Push函数
{
continue;
}
else
{
printf("进行进栈操作失败!\n");
exit(-1);
}
}
TraverseStack(&s);
//printf("需要pop出几个数据:");
//scanf("%d",&data);
while(!empty(s))
{
pop_data= pop(&s);
//printf("您去掉的数据是:%d\n",pop_data);
}
TraverseStack(&s);
//printf("清空栈");
break;
}
return 0;
}
int CVICALLBACK StopCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
int CVICALLBACK QuitCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}