简单的栈
#include <stdio.h> #define null 0 #define maxSize 5 //存放栈内元素 data[maxSize]; //栈顶指针 int top = -1; void push(int e){ if(top+1 < maxSize){ data[++top] = e; printf("push %d \n",e); }else{ printf("stack is full\n"); } } void pop(){ if(top > -1){ printf("%d poped\n",data[top--]); }else{ printf("stack is empty\n"); } } int main(){ push(1); push(2); push(3); push(4); push(5); push(6); pop(); pop(); pop(); pop(); pop(); pop(); return 0; }
相关题目
1.输入入栈序列,判断出栈序列是否合法。
in = {1,2,3,4,5} out={4,5,3,2,1}
解法就是用一个栈来模拟
i=0;j=0;
while(i<n){
s.push(in[i++]);
while(!s.empty()&&s.peek()==out[j]){
out.pop();j++;
}
}
return s.empty();
2.颠倒一个栈
解法:取出栈顶元素,然后将其余的元素颠倒,将取出的元素放在栈的最底下
void putToButtom(stack* s,object* o){
if(s.empty()){
s.push(o);
}else{
object o2 = s.pop();
putToButtom(s,o);
s.push(o2);
}
}
void rev(stack* s){
object o = s.pop();
rev(s);
putToBottom(s,o);
}
3.括号匹配问题
有一行括号序列,(,[,{,},],)的任意组合。请你检查这行括号是否配对。
void* convert(char c){ if(c=='('){ return (void*)')'; } if(c=='['){ return (void*)']'; } if(c=='{'){ return (void*)'}'; } printf("转换错误\r\n"); return (void*)ERROR; } int is_valid_seq(const char* str){ if(str==NULL){ return 0; } //初始化一个辅助栈 Stack* s = malloc(sizeof(Stack)); s->top = -1; while(*str != '\0'){ if(*str=='('||*str=='['||*str=='{'){ push(s,convert(*str)); } if(*str==')'||*str==']'||*str=='}'){ char c = (char)peek(s); if(c==*str){ pop(s); }else{ free(s); return 0; } } str++; } if(empty(s)){ free(s); return 1; }else{ free(s); return 0; } }