记录一下栈的一些基本操作,怕忘了
这里的栈是顺序栈
找了一道要用栈的例题把之前用stl的地方换成了看的书改的自己的手写栈
代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <map>
#include <vector>
using namespace std;
const int MAXN_INIT_SIZE = 100;
const int MAXN_INCREMENT = 10;
//顺序栈
struct Stack
{
int StackSize;
char *base;
char *top;
};
void *my_realloc(Stack &my_stack)
{
int size = my_stack.StackSize;
//追加内存分配
char *temp = new char[size + MAXN_INCREMENT];
if(temp == NULL){//内存分配失败
cout<<"ERROR"<<endl;
exit(0);
}
memcpy( temp, my_stack.base , size * sizeof(char));
delete my_stack.base;
my_stack.base = temp;
my_stack.top = my_stack.base + size;
my_stack.StackSize += MAXN_INCREMENT;
}
//初始化栈
void InitStack(Stack &my_stack)
{
my_stack.base = new char[MAXN_INIT_SIZE];
if(my_stack.base == NULL){//内存分配失败
cout<<"ERROR"<<endl;
exit(0);
}
my_stack.top = my_stack.base;
my_stack.StackSize = MAXN_INIT_SIZE;
}
//判断栈是否为空
bool Empty(Stack my_stack)
{
if(my_stack.top == my_stack.base) return true;
return false;
}
//取栈顶元素
char GetTop(Stack my_stack)
{
//如果栈为空,直接返回
if( Empty(my_stack )){
cout<<"栈为空"<<endl;
return 0;
}
char ans = *(my_stack.top - 1);
return ans;
}
//向栈顶压入元素
void Push(Stack &my_stack , char data)
{
if(my_stack.top - my_stack.base >= my_stack.StackSize){
my_realloc(my_stack);
}
*my_stack.top++ = data;
}
//删除栈顶元素
void Pop(Stack &my_stack)
{
//判断栈是否为空
if( Empty(my_stack) ) {
cout<<"栈为空"<<endl;
exit(0);
}
my_stack.top--;
}
//清栈
void ClearStack(Stack &my_stack)
{
delete my_stack.base;
my_stack.top = my_stack.base = NULL;//防内存泄漏
my_stack.StackSize = 0;
}
int main()
{
int n,i;
char ss[600];
scanf("%d",&n);
cin.get();
int count = 1;
Stack my_stack;
InitStack(my_stack);
while(n--){
// InitStack(my_stack);
fgets(ss , 600,stdin);
int len = strlen(ss);
for(i = 0; i < len; i++){
if(ss[i] == '(') Push(my_stack, ss[i]);
if(ss[i] == ')'){
if( Empty(my_stack) ) break;
else Pop(my_stack);
}
}
if( i== len && Empty(my_stack)) printf("Case %d:Yes\n",count);
else printf("Case %d:No\n",count);
// ClearStack(my_stack);
my_stack.top = my_stack.base;
count++;
}
ClearStack(my_stack);
return 0;
}