栈分为顺序栈和链栈,顺序栈用数组实现,因为栈的先进后出特性,一般只考虑顺序栈。
代码1(自己写的):
#include <iostream>
#include <stdio.h>
#define ERR -9999999
const int maxn = 1000;
using namespace std;
typedef struct Stack{
int data[maxn];
int top; //top指的是下一个要放入的元素位置
}Stack;
bool Is_empty(Stack &s) //判断栈是否为空
{
if(s.top == 1) return 0;
else return 1;
}
void top(Stack &s) //获取栈顶元素
{
int x = 0;
if(!Is_empty(s)) printf("NO element!\n");
else
{
x = s.data[s.top-1];
printf("top = %d",x);
}
}
void pop(Stack &s) //弹出或删除栈顶元素
{
int x;
if(!Is_empty(s)) printf("EMPTY!\n");
else
{
x = s.data[s.top--];
printf("pop is = %d",x);
}
}
void push(Stack &s,int x) //压入一个元素为x
{
if(s.top>(maxn-1)) printf("FULL!");
else
{
s.data[s.top++] = x;
}
}
int main()
{
Stack st;
st.top = 1; //当前栈为空
int X; //X为每次读入的值
int n=5; //n为输入元素的个数
for(int i=1;i<=n;i++)
{
scanf("%d",&X);
push(st,X);
}
pop(st);
top(st);
return 0;
}
代码2(西交wrong):
#include <iostream>
#include <stdio.h>
const int maxn = 1000;
typedef struct Stack{
int st[maxn];
int top;
}Stack;
Stack s;
bool IS_empty(){ //判断栈是否为空
if(s.top <= 1) return 1;
return 0;
}
bool pop(){ //出栈操作
if(s.top <= 1) return 0;
s.top--;
return 1;
}
bool push(int x){ //入栈操作
if(s.top > (maxn-1)) return 0;
s.st[s.top++] = x;
return 1;
}
int top(){ //获得栈顶元素
if(s.top <= 1) return 0;
return s.st[s.top-1];
}
int main()
{
int n; //n为操作个数
char op[10]; //判断输入操作
int ret; //ret保存返回值
s.top = 1; //栈初始化为空
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",&op);
if(op[0] == 't')
{
ret = top();
if(ret != 0)
printf("top is %d\n",ret);
else
printf("top isn't exist\n");
}
else if(op[0] == 'p' && op[1] == 'o')
{
ret =pop();
if(ret) printf("success pop\n");
else printf("fail pop\n");
}
else if((op[0] == 'p') && (op[1] == 'u'))
{
int x;
scanf("%d",&x);
ret = push(x);
if(ret) printf("success push\n");
else printf("fail push\n");
}
else
{
ret = IS_empty();
if(ret) printf("YES\n");
else printf("NO\n");
}
}
/*直接用stack实现
stack<int> st2;
st2.push(1);
int x = st2.top(); //注意此时x保存的是值,pop改变的是指针,所以下面pop后并没有改变x的值
st2.pop();
cout<<x<<endl;
*/
return 0;
}
(感谢西交wrong学长提供以上题目练习)