栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
我对于栈的看法,我认为它本质上就相当于一个加强版的数组,只不过在数组的基础上加上了一个节点,可以跟踪目前程序进行到了哪个位置。其实对于栈来说,也是线性表的拓展,继承了线性表的易于查找,方便排序的优势,同时又增加了一个top头节点,帮助我们去更方便的管理数据。
在测试老师的函数的时候,我发现老师的代码在我的编译器上运行不出来,报错如下:
错误语句:
ch = pop(tempStack);
报错类型:
[Error] name lookup of 'ch' changed for ISO 'for' scoping [-fpermissive]
然后我又再次定义了一个变量,去解决,因为前后变量类型应该不对,所以我又再次定义了一个char变量,最终调试成功。
下面是代码:
基础函数:
typedef struct CharStack
{
int top;
int data[STACK_MAX_SIZE];
} *CharStackPtr;
输出数据:
void outputStack(CharStackPtr paraStack)
{
for(int i = 0; i <= paraStack->top; i ++ )
{
printf("%c",paraStack->data[i]);
}
printf("\r\n");
}
初始定义函数:
CharStackPtr charStackInit()
{
CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(CharStack));
resultPtr->top = -1;
}
添加函数:
void push(CharStackPtr paraStackPtr, int paraValue)
{
if(paraStackPtr->top >= STACK_MAX_SIZE - 1)
{
printf("Cannot push element: stack full.\r\n");
return;
}
paraStackPtr->top ++;
paraStackPtr->data[paraStackPtr->top] = paraValue;
}
输出数据:
char pop(CharStackPtr paraStackPtr)
{
if(paraStackPtr->top < 0)
{
printf("Cannot pop element: stack empty.\r\n");
return '\0';
}
paraStackPtr->top --;
return paraStackPtr->data[paraStackPtr->top + 1];
}
测试函数:
char pop(CharStackPtr paraStackPtr)
{
if(paraStackPtr->top < 0)
{
printf("Cannot pop element: stack empty.\r\n");
return '\0';
}
paraStackPtr->top --;
return paraStackPtr->data[paraStackPtr->top + 1];
}
测试结果:
测试平台:Dev C++